首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从SHA-512散列生成的字符不会保存到数据库中。

从SHA-512散列生成的字符不会保存到数据库中。
EN

Stack Overflow用户
提问于 2011-10-09 22:52:44
回答 3查看 1.4K关注 0票数 1

我正在使用SHA512哈希密码。我正在使用实体框架代码-首先用于我的ORM。

散列算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
}

产生盐的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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中的欺骗模式下复制)。

但是EF实际上将????j???7?o保存到数据库中。如果我尝试在调试模式下使用文本可视化工具,它也会切断它。如果你注意到了,它就会在\0被切断。我所能找到的就是它是一个空字符。

问题

如何使用实体框架代码-优先在数据库中保存这个空字符?如果不能保存这些字符,如何防止SHA512为我生成这些字符?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-11 03:56:50

你应该做的是:

  • 返回SHA512哈希的字节数组,而不是字符串。
  • 使用二进制(64)数据库列来保存哈希值。

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

这些terminated

  • NULL字符串是空的,如您所说的\0

  • SHA512创建一个字节数组,任何字节都可以是空

要回答你的具体问题:

  • wRAR在上面说。

返回Convert.ToBase64String(hashValue);

票数 -1
EN

Stack Overflow用户

发布于 2011-10-09 22:54:59

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

票数 2
EN

Stack Overflow用户

发布于 2011-10-10 01:13:24

SHA-256散列不生成字符,而是生成字节。如果您想要字符串,而不是字节数组,则需要将字节转换为字符格式。正如@wRAR所建议的那样,Base64是一种常见的方法,否则您可以使用十六进制字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7709380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文