仅使用密码的加密示例...没有Salt。它有用吗?

时间:2011-04-12 21:36:47

标签: .net encryption encryption-symmetric

我一直在研究创建用于.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 个答案:

答案 0 :(得分:3)

此代码存在许多缺陷:

  1. 如果inputpassword不是ASCII,则会发生静默降级。特别是非ascii input将无法正确解密。
  2. 你没有使用很多迭代,这意味着如果真的很快就会强制执行。
  3. 由于哈希不是直接知道的,因此缺少盐比使用密码哈希更难以进行展示。但是,如果使用已知的开始块(这与许多文件头通用)对文件进行加密,则可以为这种格式构建彩虹表。但是,如果您只是尝试破解单个文件/哈希,那么彩虹表并不能获得任何好处。如果您需要以相同的方式破解许多不同的密码,它们才会获益。
  4. 不建议使用ECB模式,因为它会分别加密每个块。这使得问题更加严重,因为您只需要知道任何块的明文来构建表。特别是最后一个块通常具有低熵。我希望每个第16组数据中只有8位熵。哎哟。
  5. 我不确定PaddingMode.Zeros是如何运作的。但是由于其长度未编码,因此可能无法剥离填充。所以在解密后你可能会有一些额外的0字节。
  6.   

    电子密码本(ECB)模式分别加密每个块。任何相同且在同一消息中的纯文本块,或者在使用相同密钥加密的不同消息中的任何块将被转换为相同的密文块。重要提示:建议不要使用此模式,因为它为多个安全漏洞打开了大门。如果要加密的明文包含大量重复,则可以一次一个块地破解密文。还可以使用块分析来确定加密密钥。此外,活动对手可以在不进行检测的情况下替换和交换单个块,这样可以保存块并将其插入到其他点的流中而无需检测。

答案 1 :(得分:2)

不,这没什么不对。

Salting密码用于在存储这些散列密码时防止彩虹表攻击。在这种情况下,密码用于生成加密/解密密钥,而不是存储密码。