2013-08-16 3 views
1

C#에서 암호화 작업을하고 있는데 알아 내지 못하는 문제가 발생했습니다. 때로는 사용자 암호에 대해 매우 복잡한 소금에 절인 해시 문자열을 가져오고 이러한 문자열은 어떤 이유로 데이터베이스에 올바르게 저장되지 않습니다.암호화 된 문자열이 데이터베이스에 올바르게 저장되지 않습니다.

RNGCryptoServiceProvider 클래스에서 무작위로 생성 된 8 바이트 소금을 사용하고 있습니다. 내 HashAlgorithm으로 SHA256Managed 클래스를 사용하고 있습니다. ASCIIEncoding.Default.GetString() 메서드를 통해 만든 바이트에서 저장할 문자열을 가져오고 있습니다. 이 값이 저장되는 열은 (NVARCHAR(50), NULL)입니다. 난 SqlCommand 클래스를 사용하여 그들을 저장 해요.

내 코드를 단계별로 실행하고 직접 실행 창을 사용할 때 정확한 문자열을 볼 수 있습니다. cmd.ExecuteNonQuery()으로 전화하면 문제가 발생한 것 같습니다. 내가 아래에서 다르게해야할까요?

string query = @"UPDATE User SET password = @password WHERE id = @userID"; 

cmd = new SqlCommand(query, conn); 
cmd.Parameters.AddWithValue("@password", encryptedPassword); 
cmd.Parameters.AddWithValue("@userID", userID); 

int rowsAffected = cmd.ExecuteNonQuery(); 

추가 정보가 필요하면 알려주십시오. 내 정확한 알고리즘이나 그 결과에 대해 여기에 너무 많이 넣고 싶지는 않습니다.

감사합니다.

+1

해시 후 'hex'또는 'base64'로 변환 하시겠습니까? –

+1

Encoding.Default.GetString 임의의 바이트를 문자열로 표현하는 방법이 아닙니다. hex (base-16) 또는 base-64와 같은 base-n을 사용해야합니다. 또는 varbinary 열에 대신 저장하십시오. BTW, hashing! = encryption –

+1

아, ASCIIEncoding.Default는 실제로 ASCII가 아닙니다. 실제로 정적 인 Encoding.Default - 로컬 시스템의 기본 ansi 코드 페이지입니다. 그러나 ** 당신이 여기에서 원하는 것을하기 위해 ** 어떤 ** 인코딩도 사용할 수 없기 때문에 중요하지 않습니다. –

답변

2

바이트 배열을 문자열로 인코딩하는 대신 Convert.ToBase64String()을 사용해보십시오. 이렇게하면 문제가 해결됩니다.

+0

와아! 감사! 그것은 트릭을했다!! ASCIIEncoding.Default.GetString()과 다른 점은 무엇입니까? 그것은 효과가 있었고, 나는 왜 그런지 모릅니다. – aladd04

+1

잘못된 방향으로 인코딩을 사용하고 있기 때문에 @ aladd04 : http://tiny.cc/io 여기를 참조하십시오 (다른 주제) –

+0

"잘못된 방향으로 인코딩"이란 무엇을 의미합니까? 나는이 기사를 조사 할 것이다. 아마 그 대답은 거기에있다 :). 하하. – aladd04

관련 문제