Iphone 将密码存储在NSString中而不在内存中可读

Iphone 将密码存储在NSString中而不在内存中可读,iphone,cocoa,security,nsstring,passwords,Iphone,Cocoa,Security,Nsstring,Passwords,我需要在NSString对象中存储密码;然而,我想用某种方法来混淆它们,这样它们就不能直接从内存中读取 这是一个Mac OS X(10.5)应用程序,但如果能提供一个同样适用于iPhone的解决方案,我们将不胜感激。在将它们放入NSString之前,您不能先对它们进行md5处理吗?然后,当您进行测试时,md5将输入字符串与存储的字符串进行比较 如果使用密钥链存储密码,则可以处理不透明的密钥链SecKeychainItemRefs,而不是传递字符串,只在需要时检索明文。这也是Mac用户希望密码被处

我需要在
NSString
对象中存储密码;然而,我想用某种方法来混淆它们,这样它们就不能直接从内存中读取


这是一个Mac OS X(10.5)应用程序,但如果能提供一个同样适用于iPhone的解决方案,我们将不胜感激。

在将它们放入NSString之前,您不能先对它们进行md5处理吗?然后,当您进行测试时,md5将输入字符串与存储的字符串进行比较

如果使用密钥链存储密码,则可以处理不透明的密钥链
SecKeychainItemRefs
,而不是传递字符串,只在需要时检索明文。这也是Mac用户希望密码被处理的方式。不幸的是,在不知道为什么“需要将密码存储在
NSString
对象中”的情况下,我无法判断这是否是真的:-)

在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]];
#导入
常量字符*utf8PasswordRepresentation=[rawPassword UTF8String];
无符号字符*rawHash=malloc(CC_SHA1_DIGEST_长度);
CC_SHA1(utf8PasswordRepresentation,strlen(utf8PasswordRepresentation),rawHash);
NSMutableString*passwordHash=[NSMutableString CC_SHA1_DIGEST_LENGTH*2];
for(int i=0;i
请注意,这里没有内存管理

查看wikipedia条目以获取更多信息


在Intertube中有许多相同代码的版本。

在这里可以找到一组非常有用的用于存储和检索钥匙链密码的代码:


我用过它,而且效果很好。

我认为海报指的是在内存中混淆密码,所以你不能仅仅从内存中读取ivar的内容。google的GData库中有一些有用的代码用于XORing密码,这些密码存储为实例变量中的NSMutableData

//XorPlainMutableData是将密码保存在堆对象中的一种简单方法
//从作为纯文本可见
静态void XorPlainMutableData(NSMutableData*mutable){
//这有助于避免在堆上以明文形式存储密码
常量无符号字符theXORValue=0x95;//0x95=0xb10010101
无符号字符*dataPtr=[mutable-mutableBytes];
NSU整数长度=[可变长度];
对于(整数idx=0;idx

您可以使用XOR保存/还原密码(请参阅同一文件中的#password和#setUserCredentialsWithUsername:password:methods)。XOR不是高科技加密技术,但它足以阻止偶然的窥探。在GData客户端中,应用程序中可能有一个长寿命的service/manager对象,该对象保留对密码数据的引用,我认为这是一种合理的方法。

True。但是,您将无法使用md5字符串进行身份验证或密码正在用于的任何用途。这将阻止他们读取密码,但允许访问不同的哈希值。这些字符串确实需要随机访问,因此需要能够将其转换回可用状态。您为什么特别需要将它们存储在为什么会有人试图得到那个记忆呢?谢谢Brian,本来这就是我所指的,但Graham Lee的答案更好地解决了我的问题。但这也非常有用+1您错过了stringWithCapacity:第8行
// 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;
    }
}