SHA1加密麻烦

时间:2012-12-11 10:37:57

标签: c# database encryption

我的密码加密有问题。 我希望密码加密,如图中未突出显示的那样。

我写了以下c#代码:

        SHA1CryptoServiceProvider x = new SHA1CryptoServiceProvider();

        //byte[] bs = System.Text.Encoding.Unicode.GetBytes(password);
        //byte[] bs = System.Text.Encoding.UTF32.GetBytes(password);
        byte[] bs = System.Text.Encoding.UTF8.GetBytes(password);
        bs = x.ComputeHash(bs);
        var s = new StringBuilder();
        foreach (byte b in bs)
        {
            s.Append(b.ToString("x2").ToLower());
        }

        new UserService().ChangeUserPassword(username, s.ToString());

以正确的方式加密密码我使用以下要删除的SQL代码:

  

CAST(hashbytes('SHA1',@newuserpassword) as nvarchar)

这是结果: enter image description here

2 个答案:

答案 0 :(得分:2)

查看CONVERT的文档,我怀疑你只是想要:

CONVERT(nvarchar, hashbytes('SHA1',@newuserpassword), 2)

其中2是转换为十六进制而没有前导0x的样式。我建议你指定nvarchar的长度,它应该是40(20个字节,每个字节2个字符)。

答案 1 :(得分:0)

我强烈建议您放弃以字符形式存储二进制数据。尽管如此,如果由于遗留原因需要保留它,这里是SQL语句的翻译:

byte[] bytes = ...; //your binary data here
var nastilyBrokenChars =
    Enumerable.Range(0, bytes.Length / 2)
    .Select(i => (char)BitConverter.GetInt16(bytes, i * 2))
    .ToArray();
string nastilyBrokenString = new string(nastilyBrokenChars);

尽可能地,我在每个bytes中填充两个char。这本身就是无损转换。但我不信任将这些数据存储到SQL Server中(以后再进行比较)是无损的。