Пример шифрования только с паролем ... без соли. Это работает? - PullRequest
0 голосов
/ 13 апреля 2011

Я проводил некоторые исследования по созданию класса шифрования / дешифрования для использования в приложении .NET. Раз за разом я читал, что в дополнение к секретному паролю нужна соль. Сегодня я столкнулся с методом шифрования / дешифрования, который использует только один пароль. Есть ли что-то не так с методами шифрования, используемыми в этом коде, так как кажется, что он не использует соль?

Public Shared Function EncryptString(ByRef input As String, ByRef password As String) As String
  Dim RijndaelManagedObject As New RijndaelManaged
  Dim crypto As ICryptoTransform, MD5Obj As New MD5CryptoServiceProvider
  Dim EncryptedBytes As Byte()
  Dim HashedBytes As Byte() = New ASCIIEncoding().GetBytes(password)
  Dim PlainTextBytes As Byte() = New ASCIIEncoding().GetBytes(input)

  RijndaelManagedObject.BlockSize = 128
  RijndaelManagedObject.KeySize = 128
  RijndaelManagedObject.Mode = CipherMode.ECB
  RijndaelManagedObject.Padding = PaddingMode.Zeros
  RijndaelManagedObject.Key = MD5Obj.ComputeHash(HashedBytes)
  crypto = RijndaelManagedObject.CreateEncryptor()
  EncryptedBytes = crypto.TransformFinalBlock(PlainTextBytes, 0, PlainTextBytes.Length)

  If EncryptedBytes.Length > 0 Then
    Return Convert.ToBase64String(EncryptedBytes)
  Else
    Return String.Empty()
  End If
End Function

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

Этот код имеет ряд недостатков:

  1. Если input или password не являются ASCII, происходит тихая деградация. В частности, не ascii input не будет правильно расшифрован.
  2. Вы не используете много итераций, это означает, что грубое принуждение, если действительно быстро.
  3. Отсутствие соли сложнее выявить здесь, чем хэши паролей, поскольку хэш не известен напрямую. Но если вы шифруете файлы с известным начальным блоком (который является общим для многих заголовков файлов), тогда можно создать радужную таблицу для этого одного формата. Но, как всегда, радужные таблицы не принесут вам ничего, если вы просто попытаетесь взломать один файл / хэш. Они выигрывают только в том случае, если вам нужно взломать много разных паролей, используемых одинаково.
  4. Режим ECB не рекомендуется, поскольку он шифрует каждый блок отдельно. Это усугубляет проблему 3), так как вам просто нужно знать открытый текст любого блока для построения таблицы. В частности, последний блок обычно имеет низкую энтропию. Я ожидаю, что каждый 16-й набор данных будет содержать только 8 бит энтропии. Уч.
  5. Я не уверен, как работает PaddingMode.Zeros. Но может быть невозможно удалить отступ, так как его длина не закодирована. Так что после расшифровки у вас могут быть дополнительные 0 байтов.

Режим электронной кодовой книги (ECB) шифрует каждый блок индивидуально. Любые блоки простого текста, которые идентичны и находятся в одном и том же сообщении или находятся в другом сообщении, зашифрованном с использованием того же ключа, будут преобразованы в идентичные блоки зашифрованного текста. Важный: этот режим не рекомендуется, потому что он открывает дверь для нескольких эксплойтов безопасности. Если зашифрованный текст содержит многократные повторения, возможно, что зашифрованный текст может быть разбит по одному блоку за раз. Также можно использовать анализ блоков для определения ключа шифрования. Кроме того, активный злоумышленник может заменять и обменивать отдельные блоки без обнаружения, что позволяет сохранять блоки и вставлять их в поток в других точках без обнаружения.

2 голосов
/ 13 апреля 2011

Нет, в этом нет ничего плохого.

Соляные пароли предназначены для предотвращения атак радужной таблицы при хранении этих хешированных паролей. В этом случае пароль используется для генерации ключа шифрования / дешифрования и не сохраняется.

...