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代码加密以正确的方式密码这是结果: enter image description here

+3

以字符存储二进制数据是不安全的。你会遇到随机数据丢失和怪异的错误。 – usr

望着文档为CONVERT,我怀疑你只是想:

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

其中2是没有转换0x开头为十六进制的风格。我建议你指定nvarchar的长度,但应该是40(20字节,每字节2个字符)。

+0

tnx但我需要在c#中有相同的结果。我的意思是我想在我的数据库中使用中文字符的密码 –

+2

@SalvatoreDiFazio:你真的没有。该输出只是*破碎*。它试图以不恰当的方式将任意二进制数据表示为文本。 **不要这样做。**使用十六进制或base64。如果您目前以这种格式存储数据,则应该认为它是垃圾。 –

+0

我想可以挽救足够的数据,以便可以以足够高的准确性执行密码验证。但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(并稍后进行比较)是无损的。