SHA1加密问题
我有密码加密问题。 我想要加密的密码就像图片中未突出显示的那样。SHA1加密问题
我写了下面的C#代码:
CAST(hashbytes('SHA1',@newuserpassword) as nvarchar)
:
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代码加密以正确的方式密码这是结果:
望着文档为CONVERT
,我怀疑你只是想:
CONVERT(nvarchar, hashbytes('SHA1',@newuserpassword), 2)
其中2是没有转换0x开头为十六进制的风格。我建议你指定nvarchar
的长度,但应该是40(20字节,每字节2个字符)。
tnx但我需要在c#中有相同的结果。我的意思是我想在我的数据库中使用中文字符的密码 –
@SalvatoreDiFazio:你真的没有。该输出只是*破碎*。它试图以不恰当的方式将任意二进制数据表示为文本。 **不要这样做。**使用十六进制或base64。如果您目前以这种格式存储数据,则应该认为它是垃圾。 –
我想可以挽救足够的数据,以便可以以足够高的准确性执行密码验证。但OP应尽快放弃这一计划。 – usr
我强烈建议你放弃以字符存储二进制数据。不过,如果你需要保持遗留原因,这里是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);
就可以了,我馅2 bytes
到每个char
。这本身就是无损转换。但我不会相信将这些数据存储到SQL Server(并稍后进行比较)是无损的。
以字符存储二进制数据是不安全的。你会遇到随机数据丢失和怪异的错误。 – usr