[英]Password Verification - How to securely check if entered password is correct
我正在开发一个需要多个密码才能访问不同数据区域的应用程序。 例如,一群人可以建立一个聊天,该聊天需要密码验证才能查看。
我正在考虑这样做的方式:
我有我的关键字,假设我们说:
香蕉
当用户输入密码时,我使用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;
}
相反,当用户选择关键字/密码时
然后,在数据库中存储该用户的特定信息:
当用户想要对您的系统进行身份验证时,您可以:
请阅读如何安全地散列密码? ,托马斯·波林(Thomas Porrin)的答案目前是密码哈希中最常用的Stackexchange专着,当然也是迄今为止我所见过的最好的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.