2012-12-11 3 views
0

암호 암호화에 문제가 있습니다. 그림에 강조 표시되지 않은 암호를 암호화하고 싶습니다.SHA1 암호화 문제

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 코드를 사용하여 올바른 방법으로 암호를 암호화하기 :

나는 다음과 같은 C# 코드를 작성 결과입니다. enter image description here

+3

이진 데이터를 문자로 저장하는 것은 안전하지 않습니다. 임의의 데이터 손실 및 이상한 버그가 발생합니다. – usr

답변

2

CONVERT에 대한 문서를 보면, 내가 그냥 원하는 의심 : 2 선도적 인 0X없이 16 진수로 변환 스타일이

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

. 그래도 nvarchar 길이를 지정하는 것이 좋습니다. 40 (20 바이트, 1 바이트 당 2 문자)이어야합니다.

+0

tnx하지만 C#에서 동일한 결과가 필요합니다. 내 중국어 문자로 내 DB에 비밀 번호를 원한다는 뜻. –

+2

@SalvatoreDiFazio : 당신은 정말로하지 않습니다. 그 출력은 간단하게 깨졌습니다. 임의의 2 진 데이터를 부적절한 방식으로 텍스트로 표현하려고합니다. **하지 마십시오. ** hex 또는 base64를 사용하십시오. 현재 해당 형식으로 저장된 데이터를 가지고 있다면 가비지라고 가정해야합니다. –

+0

암호 유효성 검사가 충분히 높은 정확도로 수행 될 수 있도록 충분한 데이터를 복구 할 수 있다고 생각합니다. 그러나 OP는이 계획을 가능한 빨리 포기해야합니다. – usr

0

이진 데이터를 문자로 저장하지 말 것을 강력히 권장합니다.

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); 

당신이 할 수있는, 나는 각 char에 두 bytes 때우는 해요 : 레거시 이유로 보관해야하는 경우 그러나, 여기에 SQL 구문의 번역이다. 이것 자체로 무손실 변환입니다. 그러나 이이 데이터를 SQL Server에 저장 (나중에 비교)하는 것이 손실이 없음을 신뢰하지 않습니다.