Хранение паролей в NSString без возможности чтения в памяти - PullRequest
8 голосов
/ 15 апреля 2009

Мне нужно хранить пароли в NSString объектах; однако я хотел бы каким-то образом запутать их, чтобы они не могли быть прочитаны непосредственно из памяти.

Это приложение Mac OS X (10.5), но решение, которое также работает на iPhone, было бы очень признательно.

Ответы [ 5 ]

12 голосов
/ 15 апреля 2009

Если вы используете цепочку для ключей для хранения паролей, тогда вместо передачи строк вы можете обрабатывать непрозрачную цепочку для ключей SecKeychainItemRefs, получая только открытый текст в той точке, где это требуется. Это также способ, которым пользователи Mac ожидают обработки своих паролей. К сожалению, не зная, почему вам «нужно хранить пароли в NSString объектах», я не могу сказать, правда ли это: -)

3 голосов
/ 15 апреля 2009

На 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]];

Обратите внимание, что здесь нет управления памятью.

Проверьте запись в Википедии для объяснения хеширования пароля .

Существует множество версий этого кода на межтрубных пространствах.

3 голосов
/ 15 апреля 2009

Не могли бы вы просто md5 их, прежде чем поместить их в строку NSString? Затем, когда вы идете в тест, md5 входную строку и сравнить это с тем, что хранится?

2 голосов
/ 24 ноября 2009

Я думаю, что постер имеет в виду запутывание пароля в памяти, поэтому вы не можете просто прочитать содержимое ивара из памяти. В библиотеке GData от Google есть некоторый полезный код для паролей XORing, сохраненный как NSMutableData в переменных экземпляра.

источник для GDataServiceBase.m

// 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, где у вас может быть долгоживущий объект службы / менеджера в приложении, которое сохраняет ссылку на данные пароля, я думаю, что это разумный подход.

1 голос
/ 11 августа 2009

Очень полезный набор кода для хранения и получения паролей к и из цепочки для ключей можно найти здесь:

http://log.scifihifi.com/post/55837387/simple-iphone-keychain-code

Я использовал его, и он работал хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...