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();
추가 정보가 필요하면 알려주십시오. 내 정확한 알고리즘이나 그 결과에 대해 여기에 너무 많이 넣고 싶지는 않습니다.
감사합니다.
해시 후 'hex'또는 'base64'로 변환 하시겠습니까? –
Encoding.Default.GetString 임의의 바이트를 문자열로 표현하는 방법이 아닙니다. hex (base-16) 또는 base-64와 같은 base-n을 사용해야합니다. 또는 varbinary 열에 대신 저장하십시오. BTW, hashing! = encryption –
아, ASCIIEncoding.Default는 실제로 ASCII가 아닙니다. 실제로 정적 인 Encoding.Default - 로컬 시스템의 기본 ansi 코드 페이지입니다. 그러나 ** 당신이 여기에서 원하는 것을하기 위해 ** 어떤 ** 인코딩도 사용할 수 없기 때문에 중요하지 않습니다. –