0

我的密码加密有问题。我想像图片中未突出显示的那样加密密码。

我编写了以下 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)

这是结果: 在此处输入图像描述

4

2 回答 2

2

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

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

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

于 2012-12-11T10:43:20.367 回答
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(并稍后进行比较)是无损的。

于 2012-12-11T11:49:50.637 回答