【发布时间】:2014-04-29 02:40:47
【问题描述】:
我正在开发一个需要多个密码才能访问不同数据区域的应用。例如,一群人可以建立一个需要密码验证才能查看的聊天。
我正在考虑这样做:
我有我的关键字,假设性地说:
香蕉
当用户输入他们的密码时,我使用 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;
}
【问题讨论】:
-
您的解决方案看起来不错,但恕我直言,更好的方法是将哈希存储在服务器上并从客户端发送每个猜测密码以进行检查
标签: objective-c security encryption passwords rncryptor