Как сгенерировать надежный ключ шифрования для TripleDESCryptoServiceProvider

Я использую TripleDESCryptoServiceProvider, и мне нужно сохранить ключ шифрования.

Если я вызываю GenerateKey метод провайдера, будет ли это просто строка в кодировке base64? Если да, могу ли я расшифровать его как таковой, используя полученную строку в качестве ключа?

С другой стороны, есть ли проблема с использованием этого же ключа в качестве солевого ключа при выполнении одностороннего хеширования? Я пишу простой провайдер членства для .net, который позволяет пользователю выбирать метод шифрования (простой, хэш, зашифрованный), поэтому задумался, нужно ли заставлять пользователя указывать как солевой ключ, так и ключ шифрования.


person Ben Foster    schedule 09.10.2011    source источник


Ответы (2)


Вызов GenerateKey создаст новый, случайный, безопасный (т.е. неслабый) ключ. Его длина (128 или 192) будет зависеть от того, как настроен ваш TripleDESCryptoServiceProvider.

Если я вызываю метод GenerateKey провайдера, будет ли это всего лишь строка в кодировке base 64?

Сам формат представляет собой массив byte[], поскольку вы можете получить его только из свойства Key, поэтому это не base64, но при желании его можно легко закодировать таким образом, например Convert.ToBase64String(algo.Key);

Если да, могу ли я расшифровать его как таковой, используя полученную строку в качестве ключа?

Вы не можете использовать строку в качестве ключа - только если вы не конвертируете ее обратно в byte[]. Однако вы можете сохранить ключ в виде строки между его использованием (если это поможет вашему приложению).

С другой стороны, есть ли проблема с использованием этого же ключа в качестве солевого ключа при выполнении одностороннего хеширования?

Если вы используете случайные данные в качестве ключа или в качестве соли, тогда проблем возникнуть не должно. Только не используйте одни и те же данные для обоих (и).

person poupou    schedule 09.10.2011

С другой стороны, есть ли проблема с использованием этого же ключа в качестве солевого ключа при выполнении одностороннего хеширования?

Соли являются общедоступными параметрами; а частные и симметричные ключи должны быть секретными.

Я пишу простой провайдер членства для .net, который позволяет пользователю выбирать метод шифрования (простой, хэш, зашифрованный), поэтому задумался, нужно ли заставлять пользователя указывать как солевой ключ, так и ключ шифрования.

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

person jww    schedule 09.10.2011
comment
здесь пользователь - разработчик. Я бы конечно не позволил пользователю приложения решать это. Так что нет ничего плохого в том, чтобы хранить соль вместе с хешированным паролем? - person Ben Foster; 11.10.2011
comment
@Ben: это очень похоже на файл паролей unix (кортеж {user, salt, hash}). Если так, то с форматом хранения проблем бы не было. - person jww; 11.10.2011