从SHA-512哈希生成的字符不会保存到数据库

时间:2011-10-10 06:52:44

标签: algorithm entity-framework hash entity-framework-4.1 ef-code-first

我正在使用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为我生成这些字符?

3 个答案:

答案 0 :(得分:2)

我建议在保存前使用Base64对哈希进行编码。另一方面,在添加密码之前用Base64编码盐听起来很奇怪。

答案 1 :(得分:0)

SHA-256哈希不生成字符,它会生成字节。如果要使用字符串而不是字节数组,则需要将字节转换为字符格式。正如@wRAR所建议的那样,Base64是一种常用的方法,否则你只能使用十六进制字符串。

答案 2 :(得分:-1)

你应该做什么:

  • 返回SHA512哈希字节数组而不是字符串。
  • 使用BINARY(64)数据库列保存哈希值。

为什么你的方法不起作用:

  • 这些ASCII字符串以NULL结尾
  • NULL就像你说的那样\ 0
  • SHA512创建一个字节数组,任何字节都可以为NULL

回答您的具体问题:

  • 上面的wRAR说道。

    return Convert.ToBase64String(hashValue);