2016-02-18 3 views
0

Я использую RNEncryptor и RNDecryptor классы для шифрования и дешифрования следующим образом:Стратегия создания и сохранения пароля для шифрования и дешифрования

NSData *encryptedData = [RNEncryptor encryptData:input 
            withSettings:kRNCryptorAES256Settings 
             password:thePassword 
              error:nil]; 

NSData *output = [RNDecryptor decryptData:encryptedData 
          withSettings:kRNCryptorAES256Settings 
           password:thePassword 
            error:nil]; 

В первый раз я должен зашифровать данные в моем приложении я генерировать пароль, используя RNCryptor класс следующим образом:

NSData *thePasswordData = [RNCryptor randomDataOfLength:32]; 
NSString *thePassword = [aesPasswordData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 

я сохранить этот сгенерированный пароль в Keychain в приложения и использовать его для всего последующего шифрования и дешифрования.

Является ли это хорошей стратегией для шифрования/дешифрования или может ли кто-нибудь увидеть какие-либо недостатки? Должен ли я вместо этого генерировать ключ AES и хранить его в Keychain и работать с этим, а не с паролем?

Edit: Я изменил выше, как сгенерировать пароль с помощью NSProcessInfo класс, используя RNCryptor класс, основанный на ответ Роб Непера. В остальном мне все еще интересно узнать, правильна ли и правильна ли стратегия в целом по работе с паролем, а не с ключом AES.

+1

'globallyUniqueString' или' NSUUID' в порядке, но ничто не сравнится с запросом пользователя на хороший пароль. – Wain

+0

Спасибо за ответ Wain. Мне нужно, чтобы это произошло беспрепятственно ... без взаимодействия с пользователем. Поэтому я должен создать случайную строку. –

+0

@Wain Но как можно доверять пользователю, чтобы предоставить хороший пароль? «Passw0rd» пройдет большинство тестов, 8 символов, по крайней мере одна прописная буква и одно число еще далеко от хорошего пароля. – zaph

ответ

2

Это не лучший способ выбрать пароль. globallyUniqueString может быть вполне предсказуемым во многих его битах. Вам гораздо лучше использовать что-то вроде RNCryptor.randomDataOfLength для генерации капли желаемой длины (32 байта бы идеальны), а затем base-64 закодировать его, чтобы получить пароль.

Использование randomDataOfLength для генерации ключей вместо этого не было бы более безопасным, но было бы быстрее (на 10 секунд в миллисекундах в зависимости от устройства, если это имеет для вас значение). В общем, я рекомендую использовать интерфейс пароля, если у вас нет особой проблемы, когда ключи особенно полезны. Ключи немного сложнее использовать правильно.

+0

Привет, Роб, спасибо за ответ. Удовольствие! :-) Я не понимал, что библиотека 'RPCryptor' имела метод генерации случайных данных. Я обновил свой код и мой вопрос выше, чтобы использовать это. В стороне, я предполагаю, основываясь на вашем ответе, что работа с паролями и Keychain приложения - хорошая стратегия, и мне не нужно работать с ключами напрямую? –

+1

Также доступны Apple ['arc4random_buf'] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/arc4random.3.html) и [' SecRandomCopyBytes() '] (https://developer.apple.com/library/prerelease/ios/documentation/Security/Reference/RandomizationReference/index.html#//apple_ref/doc/uid/TP40007281-CH5-SW3). – zaph

+1

Да; 'randomDataOfLength' - это просто оболочка objc вокруг' SecRandomCopyBytes'. Если вы уже импортировали RNCryptor, это удобно. –

1

Фактический ключ шифрования, используемый этими libs, получен из пароля, если вы используете один, но IIRC, соленый, поэтому он не является менее безопасным.

Существуют опасения относительно теоретического уровня безопасности, предоставляемого этими библиотеками (см. How to correctly encrypt data with proper authentication using AES-256-CBC in php?), но вы должны принять решение по этому поводу. Необходимо помнить, что RNCryptor представляет собой набор библиотек (которые могут быть опубликованы векторами атак в разных реализациях) и согласованный формат, что полезно, если вы хотите переместить зашифрованные данные на разных платформах.

Лично я бы чувствовал себя более комфортно с помощью уникального случайного ключа AES для каждого шифрования и хранения ключа, зашифрованного с помощью RSA, хранящегося в цепочке ключей.

+0

Спасибо за ответ J.B. Я обязательно буду учитывать это и буду переоценивать, должен ли я работать с ключами напрямую и предлагает ли библиотека RNCryptor необходимую мне безопасность. –

+1

Конечно, если вы используете новый ключ каждый раз, когда вы зашифровываете что-либо (например, с помощью RNCryptor), то вы ограничиваете любую успешную атаку на этот ключ этим конкретным блобом. Кроме того, асимметричное криптографическое (RSA) намного проще работать с IME ... –

Смежные вопросы