我正在开发一款需要多个密码才能访问不同数据区域的应用。例如,一群人可以设置需要密码身份验证才能查看的聊天。
以下是我正在考虑的方式:
我有我的关键字,假设说:
香蕉
当用户输入密码时,我使用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;
}
答案 0 :(得分:5)
相反,当用户选择关键字/密码短语
时然后在您的数据库中,您存储该用户的特定内容:
当用户想要对您的系统进行身份验证时,您:
请阅读How to securely hash passwords?,其中Thomas Porrin的答案目前最常被提及Stackexchange密码散列论文,当然是迄今为止我见过的最好的。
答案 1 :(得分:1)