我正在使用SHA512哈希密码。我正在使用实体框架代码-首先用于我的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中的欺骗模式下复制)。
但是EF实际上将????j???7?o
保存到数据库中。如果我尝试在调试模式下使用文本可视化工具,它也会切断它。如果你注意到了,它就会在\0
被切断。我所能找到的就是它是一个空字符。
问题
如何使用实体框架代码-优先在数据库中保存这个空字符?如果不能保存这些字符,如何防止SHA512为我生成这些字符?
发布于 2011-10-11 03:56:50
你应该做的是:
为什么您的方法不起作用:
这些terminated
要回答你的具体问题:
返回Convert.ToBase64String(hashValue);
发布于 2011-10-09 22:54:59
在保存之前,我建议使用Base64编码哈希。另一方面,在添加密码之前用Base64对salt进行编码听起来很奇怪。
发布于 2011-10-10 01:13:24
SHA-256散列不生成字符,而是生成字节。如果您想要字符串,而不是字节数组,则需要将字节转换为字符格式。正如@wRAR所建议的那样,Base64是一种常见的方法,否则您可以使用十六进制字符串。
https://stackoverflow.com/questions/7709380
复制相似问题