我正在使用SHA512哈希密码。我正在使用Entity Framework Code-First作为我的ORM。
哈希算法
public static string CreateSHA512Hash(string pwd, string salt)
{
string saltAndPwd = String.Concat(pwd, salt);
var ae = new ASCIIEncoding();
byte[] hashValue, messageBytes = ae.GetBytes(saltAndPwd);
var sHhash = new SHA512Managed();
hashValue = sHhash.ComputeHash(messageBytes);
sHhash.Dispose();
return ae.GetString(hashValue);
}
生成盐的代码:
//Generate a cryptographic random number.
var rng = new RNGCryptoServiceProvider();
var buff = new byte[size];
rng.GetBytes(buff);
rng.Dispose();
// Return a Base64 string representation of the random number.
return Convert.ToBase64String(buff);
问题:
出于某种原因,似乎哈希函数会随机生成一些字符,而后面的字符不会保存到数据库中。在这种情况下(我不确定是否有其他字符可以执行此操作),但它是\0
。
例如。密码:testuser
。盐:uvq5i4CfMcOMjKPkwhhqxw==
哈希生成:????j???7?o\0?dE??????:???s?x??u?',Vj?mNB??c???4H???vF\bd?T?
(在visual studio中的dubug模式下复制)。
但是EF实际上将????j???7?o
保存到数据库中。如果我尝试在调试模式下使用文本可视化工具,它也会将其关闭。如果您注意到,它会在\0
处被切断。我能找到的就是它的空字符。
问题
如何使用Entity Framework Code-First在数据库中保存此空字符?如果无法保存,我该如何阻止SHA512为我生成这些字符?
答案 0 :(得分:2)
我建议在保存前使用Base64对哈希进行编码。另一方面,在添加密码之前用Base64编码盐听起来很奇怪。
答案 1 :(得分:0)
SHA-256哈希不生成字符,它会生成字节。如果要使用字符串而不是字节数组,则需要将字节转换为字符格式。正如@wRAR所建议的那样,Base64是一种常用的方法,否则你只能使用十六进制字符串。
答案 2 :(得分:-1)
你应该做什么:
为什么你的方法不起作用:
回答您的具体问题:
上面的wRAR说道。
return Convert.ToBase64String(hashValue);