我需要将密码存储在NSString
对象中;但是,我想要一些方法来混淆它们,所以它们不能直接从内存中读取。
这是一个 Mac OS X (10.5) 应用程序,但也适用于 iPhone 的解决方案将不胜感激。
如果您使用钥匙串来存储密码,那么您可以处理不透明的钥匙串,而不是传递字符串SecKeychainItemRefs
,只在需要的地方检索明文。这也是 Mac 用户期望他们的密码被处理的方式。不幸的是,不知道为什么你“需要将密码存储在NSString
对象中”,我无法判断这是否真的 :-)
难道你不能在将它们放入 NSString 之前对它们进行 md5 吗?然后当你去测试时,md5输入字符串并将其与存储的内容进行比较?
在 iPhone 上,沙盒将阻止任何人访问您的密码。在桌面上它不是那么容易。
您应该将密码存储为散列而不是明文。我相信这会在不影响功能的情况下为您提供所需的结果。您永远无法做的唯一想法是再次访问明文密码 - 如果您想分析它的强度或将其传递给另一个服务。但总的来说,哈希不会牺牲功能。
以下代码在 rawPassword 中获取密码,并将其 SHA-1 哈希存储在 passwordHash 中。
#import <CommonCrypto/CommonDigest.h>
const char* utf8PasswordRepresentation = [rawPassword UTF8String];
unsigned char * rawHash = malloc(CC_SHA1_DIGEST_LENGTH);
CC_SHA1(utf8PasswordRepresentation, strlen(utf8PasswordRepresentation), rawHash);
NSMutableString* passwordHash = [NSMutableString CC_SHA1_DIGEST_LENGTH*2];
for (int i = 0 ; i< CC_SHA1_DIGEST_LENGTH; i++)
[passwordHash appendFormat:@"%02x" , rawHash[i]];
请注意,这里没有内存管理。
查看 wikipedia 条目以获取密码散列的解释。
intertubes周围有许多相同的代码版本。
我认为张贴者指的是在内存中混淆密码,所以你不能只从内存中读取 ivar 的内容。谷歌的 GData 库有一些有用的代码,用于异或密码,存储为实例变量中的 NSMutableData。
// XorPlainMutableData is a simple way to keep passwords held in heap objects
// from being visible as plain-text
static void XorPlainMutableData(NSMutableData *mutable) {
// this helps avoid storing passwords on the heap in plaintext
const unsigned char theXORValue = 0x95; // 0x95 = 0xb10010101
unsigned char *dataPtr = [mutable mutableBytes];
NSUInteger length = [mutable length];
for (NSUInteger idx = 0; idx < length; idx++) {
dataPtr[idx] ^= theXORValue;
}
}
您可以使用 XOR 保存/恢复密码(请参阅同一文件中的 #password 和 #setUserCredentialsWithUsername:password: 方法)。XOR 不是高科技加密,但足以阻止随意窥探。对于 GData 客户端,您可能在应用程序中拥有一个长期存在的服务/管理器对象,该对象保留对密码数据的引用,我认为这是一种合理的方法。
可以在此处找到一组非常有用的代码,用于在钥匙串中存储和检索密码:
http://log.scifihifi.com/post/55837387/simple-iphone-keychain-code
我用过,效果很好。