Несколько вещей здесь ...
- Обычно вы не должны шифровать пароли. Вы должны хэш их.
Если вы решите продолжить шифрование ..
- Вы используете алгоритм DES. Это считается небезопасным и ошибочным. Я бы порекомендовал посмотреть на алгоритм AES.
- В зависимости от объема данных, с которыми вы работаете,
CryptoStream
может быть излишним.
- Использование кодировки ASCII может привести к потере данных, которые не являются ASCII, например кириллицы. Рекомендуемое исправление - использовать что-то еще, например, UTF8.
Вот пример:
string text = "Hello";
using (var aes = new AesManaged())
{
var bytes = System.Text.Encoding.UTF8.GetBytes(text);
byte[] encryptedBytes;
using (var encrypt = aes.CreateEncryptor())
{
encryptedBytes = encrypt.TransformFinalBlock(bytes, 0, bytes.Length);
}
byte[] decryptedBytes;
using (var decrypt = aes.CreateDecryptor())
{
decryptedBytes = decrypt.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
}
var decryptedText = System.Text.Encoding.UTF8.GetString(decryptedBytes);
Console.Out.WriteLine("decryptedText = {0}", decryptedText);
}
Это будет использовать случайный ключ каждый раз. Вполне вероятно, что вам нужно будет зашифровать некоторые данные, а затем расшифровать их позже. Когда вы создаете объект AesManaged
, вы можете сохранить свойства Key
и IV
. Вы можете повторно использовать один и тот же ключ, если хотите, но разные данные всегда должны быть зашифрованы с использованием другого IV (вектора инициализации). Где вы храните этот ключ, зависит от вас. Вот почему хэширование может быть лучшей альтернативой: ключа нет, и не нужно беспокоиться о безопасном хранении ключа.
Если вы хотите пойти по пути хеширования, вот небольшой пример:
var textToHash = "hello";
using (SHA1 sha = new SHA1Managed())
{
var bytesToHash = System.Text.Encoding.UTF8.GetBytes(textToHash);
var hash = sha.ComputeHash(bytesToHash);
string base64hash = Convert.ToBase64String(hash);
}
При этом используется алгоритм SHA1, который должен хорошо работать для паролей, однако вы можете рассмотреть SHA256
.
Концепция проста: хеш будет генерировать (в основном) уникальный вывод для входа, однако вывод не может быть преобразован обратно во вход - это разрушительно. Всякий раз, когда вы хотите проверить, должен ли пользователь проходить аутентификацию, проверьте хэш пароля, который он вам дал, и проверьте его на соответствие хэшу правильного пароля. Таким образом, вы не храните ничего чувствительного.