Imports System.Text.Encoding Imports System.Security.Cryptography Imports System.IO Define the following subroutine: 다음의 서브루틴을 정의한다: Private Sub Hashing_SHA1() "--- 사용자에게 비밀번호를 입력하도록 요청 --- Console.Write("Please enter a password: ") Dim password As String = Console.ReadLine() "---비밀번호를 해싱함 --- Dim data() As Byte = ASCII.GetBytes(password) Dim passwordHash() As Byte Dim sha As New SHA1CryptoServiceProvider() passwordHash = sha.ComputeHash(data) "--- 사용자에게 동일한 비밀번호를 한번 더 입력하도록 요청 --- Console.Write("Please enter password again: ") password = Console.ReadLine() "--- 두 번째 비밀번호를 해싱한 다음 첫 번째 것과 비교 --- data = System.Text.Encoding.ASCII.GetBytes(password) If ASCII.GetString(passwordHash) = _ ASCII.GetString(sha.ComputeHash(data)) Then Console.WriteLine("Same password") Else Console.WriteLine("Incorrect password") End If End Sub이 서브루틴에서 여러분은 먼저 사용자에게 비밀번호를 입력해 달라고 요청하고 난 다음 SHA1 구현을 사용하여 입력된 비밀번호를 해싱한다. 그런 다음 사용자에게 동일한 비밀번호를 다시 한번 입력해 달라고 요청한다. 두 번째로 입력된 비밀번호가 첫 번째 것과 일치하는지 확인하기 위해 두 번째로 입력된 비밀번호를 해싱한 다음 두 해시값을 서로 비교한다. SHA1 구현에서는 생성되는 해시 값의 길이는 160비트이다(passwordHash 바이트 배열은 20개의 멤버[8비트ⅹ20 = 160비트]를 가짐). 위 예제에서는 해시 값을 문자열로 변환한 다음 비교를 하였는데, 그것들을 Base64 인코딩으로 변환한 다음 비교할 수도 있다. 아니면 두 해시 값의 바이트 배열을 이용하여 바이트 대 바이트로 비교할 수도 있다. 한 바이트라도 서로 일치하지 않을 경우 두 해시 값이 서로 동일하지 않다고 결론 내릴 수 있다.
Sub Main() Hashing_SHA1() Console.Read() End Sub[그림 1]은 서브루틴을 실행한 결과를 보여준다.
Private Sub Hashing_MD5() "--- 사용자에게 비밀번호를 입력해 달라고 요청 --- Console.Write("Please enter a password: ") Dim password As String = Console.ReadLine() "--- 비밀번호를 해싱 --- Dim data() As Byte = ASCII.GetBytes(password) Dim passwordHash() As Byte Dim md5 As New MD5CryptoServiceProvider() passwordHash = md5.ComputeHash(data) "--- 사용자에게 다시 한번 동일한 비밀번호를 입력해 달라고 요청 --- Console.Write("Please enter password again: ") password = Console.ReadLine() "--- 두 번째로 입력된 비밀번호를 해싱한 다음 첫 번째 것과 비교 --- data = ASCII.GetBytes(password) If ASCII.GetString(passwordHash) = _ ASCII.GetString(md5.ComputeHash(data)) Then Console.WriteLine("Same password") Else Console.WriteLine("Incorrect password") End If End Sub두 방식간의 가장 큰 차이점은 MD5로 해싱된 해시값의 길이는 128비트라는 것이다.
Private Sub Salted_Hashing_SHA1() "--- 난수 생성기(Random Number Generator)--- Dim salt(8) As Byte Dim rng As New RNGCryptoServiceProvider rng.GetBytes(salt) "--- 사용자에게 비밀번호를 입력해 달라고 요청 --- Console.Write("Please enter a password: ") Dim password As String = Console.ReadLine() "--- salt를 비밀번호에 추가 --- password &= ASCII.GetString(salt) "--- 비밀번호를 해싱 --- Dim data() As Byte = ASCII.GetBytes(password) Dim passwordHash() As Byte Dim sha As New SHA1CryptoServiceProvider() passwordHash = sha.ComputeHash(data) "--- 사용자에게 다시 한번 동일한 비밀번호를 입력해 달라고 요청 --- Console.Write("Please enter password again: ") password = Console.ReadLine() Console.WriteLine(ASCII.GetString(salt)) "--- 두 번째 비밀번호에도 salt 추가 --- password &= ASCII.GetString(salt) "--- 두 번째로 입력된 비밀번호를 해싱한 다음 첫 번째 것과 비교 --- data = ASCII.GetBytes(password) If ASCII.GetString(passwordHash) = _ ASCII.GetString(sha.ComputeHash(data)) Then Console.WriteLine("Same password") Else Console.WriteLine("Incorrect password") End If End Sub한 가지 주의할 점은 만약 여러분이 비밀번호를 저장하는 데 있어 salted 해싱을 사용할 경우 각 비밀번호에 사용하는 “salt”는 메인 데이터베이스로부터 분리시켜 저장하여 해커가 그것을 쉽게 획득할 기회를 얻지 못하도록 해야 한다는 것이다.
이전 글 : DNS에서 하면 안되는 기본적 실수 5가지(2)
다음 글 : .NET의 암호화 API 사용하기(2)
최신 콘텐츠