我一直在研究创建用于.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
答案 0 :(得分:3)
此代码存在许多缺陷:
input
或password
不是ASCII,则会发生静默降级。特别是非ascii input
将无法正确解密。PaddingMode.Zeros
是如何运作的。但是由于其长度未编码,因此可能无法剥离填充。所以在解密后你可能会有一些额外的0字节。电子密码本(ECB)模式分别加密每个块。任何相同且在同一消息中的纯文本块,或者在使用相同密钥加密的不同消息中的任何块将被转换为相同的密文块。重要提示:建议不要使用此模式,因为它为多个安全漏洞打开了大门。如果要加密的明文包含大量重复,则可以一次一个块地破解密文。还可以使用块分析来确定加密密钥。此外,活动对手可以在不进行检测的情况下替换和交换单个块,这样可以保存块并将其插入到其他点的流中而无需检测。
答案 1 :(得分:2)
不,这没什么不对。
Salting密码用于在存储这些散列密码时防止彩虹表攻击。在这种情况下,密码用于生成加密/解密密钥,而不是存储密码。