我正在开发一个需要多个密码才能访问不同数据区域的应用程序。例如,一群人可以建立一个需要密码验证才能查看的聊天。
这是我正在考虑这样做的方式:
我有我的关键字,假设说:
香蕉
当用户输入他们的密码时,我使用 RNCryptorBanana
使用他们输入的密钥进行加密,并将该加密字符串存储到服务器。
后来,当有人尝试输入密码时,我从服务器获取哈希值并尝试使用他们输入的密码作为密钥对其进行解密。如果解密的值等于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;
}