安全影响的储存密码在设置。束和越来越与CFPreferencesCopyAppValue
-
12-09-2019 - |
题
抱歉似乎显而易见的这个问题,但无论出于何种原因,我还没有能够找到一个明确的答案在苹果文件关于在哪里和如何设置。捆绑的密码信息被存储。我的问题:如果我需要储存一些凭据的应用程序,和我使用设置。捆绑因此,密码进入了一个PSTextFieldSpecifier文本框在苹果公司的设置区域与IsSecure=YES,然后我访问的价值从我的应用程序使用CFPreferencesCopyAppValue,从来没有写出来NSUserDefaults和只发送了网络安全,安全是存储和检索的方法相比较时以存储和检索的使用密码钥匙扣在我自己的应用程序设置的?谢谢你的投入。
解决方案
CFPreferencesCopyAppValue
只是访问您使用NSUserDefaults
时得到相同的信息核心基础方式。在安全方面,功能是完全一样的。也就是说,它不加密。它的安全只有在这个意义上,它是模糊的。 “正确的”的答案是使用钥匙串。
要的是,计数器是,许多应用程序使用NSUserDefaults
存储密码。你可以说,除非密码控制访问到任何有价值的信息,那么它不值得在试图用钥匙串的努力。这使我的第二个参数赞成设置应用程序中使用安全领域:钥匙扣API是可怕的,并且至少在我的经验,编写正确的代码是棘手的。
其他提示
不要节省用户密码在设置束。
它不是安全的。
记住,你不需要知道什么原始密码是,你需要知道如果用户输入密码 比赛 原始密码。正确的方式来处理密码在iOS是
- 使用钥匙链,如其他人所说的
- 产生一个加密的单向散列函数中使用SHA-512或其他加密和储存造成的散列和盐
NSUserDefaults
这些选择,进行加密的密码和存储哈希+盐是迄今为止最简单的。这里就是你要做的储存密码:
- 抓住密码从用户
- 创建一个随机的盐价值
- 创建一个只向前使用哈希SHA-512和随机的盐价值
- 储存造成的散列和盐价值
NSUserDefaults
-这些价值观不能被黑客用来确定原始密码,因此没有需要它们存储在一个安全的地方。
现在,当使用者进入密码,你必须验证,如果这是正确的,这里就是你要做的:
- 抓住密码从用户
- 抓住之前保存的散列+盐值
NSUserDefaults
- 创建一个只向前散列使用同一散列函数所使用的加密的原始密码--通过它的企图的密码和盐值
NSUserDefaults
- 比较所得的散列与一个是储存在
NSUSerDefaults
.如果他们是相同的,然后用户进入正确的密码。
这里的代码生成盐和前进-只有哈希:
NSString *FZARandomSalt(void) {
uint8_t bytes[16] = {0};
int status = SecRandomCopyBytes(kSecRandomDefault, 16, bytes);
if (status == -1) {
NSLog(@"Error using randomization services: %s", strerror(errno));
return nil;
}
NSString *salt = [NSString stringWithFormat: @"%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
bytes[0], bytes[1], bytes[2], bytes[3],
bytes[4], bytes[5], bytes[6], bytes[7],
bytes[8], bytes[9], bytes[10], bytes[11],
bytes[12], bytes[13], bytes[14], bytes[15]];
return salt;
}
NSData *FZAHashPassword(NSString *password, NSString *salt) {
NSCParameterAssert([salt length] >= 32);
uint8_t hashBuffer[64] = {0};
NSString *saltedPassword = [[salt substringToIndex: 32] stringByAppendingString: password];
const char *passwordBytes = [saltedPassword cStringUsingEncoding: NSUTF8StringEncoding];
NSUInteger length = [saltedPassword lengthOfBytesUsingEncoding: NSUTF8StringEncoding];
CC_SHA512(passwordBytes, length, hashBuffer);
for (NSInteger i = 0; i < 4999; i++) {
CC_SHA512(hashBuffer, 64, hashBuffer);
}
return [NSData dataWithBytes: hashBuffer length: 64];
}
代码,这个例子就是在这里找到: http://blog.securemacprogramming.com/2011/04/storing-and-testing-credentials-cocoa-touch-edition/
在iPhone上的钥匙扣将是最安全的,除非你使用自定义的加密,这是很难做到的(出口)。 NSUserDefaults的不被认为是安全的。