Jes*_*alm 1 .net c# passwords md5 utf-8
我发现以下代码用于在将密码存储在MSSQL数据库(该列为NVARCHAR类型)之前对其进行哈希处理.
string HashPassword(string password)
{
var encoding = Encoding.UTF8,
var plainBytes = encoding.GetBytes(password);
var hashedBytes = MD5.Create().ComputeHash(plainBytes);
return encoding.GetString(hashedBytes); //<-- Bad practice?
}
Run Code Online (Sandbox Code Playgroud)
起初我认为尝试将随机字节存储为UTF8字符串并且我应该将其更改为Base64编码真的很奇怪.但除了糟糕的做法之外,这样做有什么实际意义吗?
并且; 如果有人会得到数据库的保留,这是不是意味着不可能使用彩虹表或类似的尝试和暴力反转哈希,因为原始字节丢失?
您通过减少将要编码的可能字符串的数量来削弱安全性.任何时候你的哈希最终都是一个无效的UTF-8序列,你最终会得到U + FFFD作为输出字符(Unicode"替换"字符).这意味着多个哈希以相同的字符串结束:
using System;
using System.Text;
class Program
{
static void Main(string[] args)
{
byte[] hash1 = FillBytes(128);
byte[] hash2 = FillBytes(129);
string text1 = Encoding.UTF8.GetString(hash1);
string text2 = Encoding.UTF8.GetString(hash2);
Console.WriteLine(text1 == text2);
}
static byte[] FillBytes(byte data)
{
byte[] bytes = new byte[16];
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = data;
}
return bytes;
}
}
Run Code Online (Sandbox Code Playgroud)
返回的文本也可能GetString无法正确存储在SQL Server中,具体取决于您如何配置它.(如果该字段设置,以便它可以存储在Unicode的东西,这部分是好的.)如果是丢失数据,这甚至更糟-在存储正确的哈希将不匹配计算正确的哈希值,所以有人在打字正确的密码仍将被拒绝访问.正如我所说,这可能不是问题 - 但你没有给我们足够的信息来肯定地说,所以它至少值得考虑.如果使用Base64或hex,这部分将不会成为问题,两者都以ASCII数据结束.
使用MD5来对密码进行哈希是一个糟糕的主意 - 通过有损的文本转换进一步削弱密码会更糟糕.它使攻击者更容易找到仍然以相同文本结尾的错误密码.
我会建议:
| 归档时间: |
|
| 查看次数: |
664 次 |
| 最近记录: |