Log*_*gan 0 security encryption passwords objective-c rncryptor
我正在开发一个需要多个密码来访问不同数据区域的应用程序.例如,一群人可以设置需要密码身份验证才能查看的聊天.
这是我正在考虑这样做的方式:
我有我的关键字,假设说:
香蕉
当用户输入密码时,我使用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;
}
Run Code Online (Sandbox Code Playgroud)
相反,当用户选择关键字/密码短语时
然后在您的数据库中,您存储该用户的特定内容:
当用户想要对您的系统进行身份验证时,您:
请阅读如何安全地散列密码?其中Thomas Porrin的答案是目前最常提到的关于密码散列的Stackexchange论文,当然是迄今为止我见过的最好的.
| 归档时间: |
|
| 查看次数: |
938 次 |
| 最近记录: |