Я разрабатываю приложение, для которого требуется несколько паролей для доступа к различным областям данных. Например, группа людей может настроить чат, для просмотра которого требуется аутентификация по паролю.
Вот как я думаю сделать это:
У меня есть ключевое слово, скажем гипотетически:
Банан
Когда пользователь вводит свой пароль, я использую RNCryptor для шифрования Banana
с помощью введенного им ключа и сохраняю эту зашифрованную строку на сервере.
Позже, когда кто-то пытается ввести пароль, я беру хешированное значение с сервера и пытаюсь расшифровать его, используя пароль, который они ввели в качестве ключа. Если расшифрованное значение равно Banana
, я знаю, что они ввели правильный пароль.
Я новичок в безопасности, поэтому не уверен, что это подходящее решение. Вся помощь приветствуется.
Обновлять
После внесения некоторых изменений, предложенных @Greg и метко названных @Anti-weakpasswords, вот что у меня есть:
- (NSDictionary *) getPasswordDictionaryForPassword:(NSString *)password {
NSData * salt = [self generateSalt256];
NSData * key = [RNCryptor keyForPassword:password salt:salt settings:mySettings];
NSMutableDictionary * passwordDictionary = [NSMutableDictionary new];
NSString * saltString = stringFromData(salt);
NSString * keyString = stringFromData(key);
passwordDictionary[@"key"] = keyString;
passwordDictionary[@"salt"] = saltString;
passwordDictionary[@"version"] = @"1.0.0";
passwordDictionary[@"iterationCount"] = @"10000";
return passwordDictionary;
}
static const RNCryptorKeyDerivationSettings mySettings = {
.keySize = kCCKeySizeAES256,
.saltSize = 32,
.PBKDFAlgorithm = kCCPBKDF2,
.PRF = kCCPRFHmacAlgSHA1,
.rounds = 10000
};
- (NSData *)generateSalt256 {
unsigned char salt[32];
for (int i=0; i<32; i++) {
salt[i] = (unsigned char)arc4random();
}
NSData * dataSalt = [NSData dataWithBytes:salt length:sizeof(salt)];
return dataSalt;
}