VB.NETのハッシュ値を取得するサンプルです。
目次
サンプル | ハッシュ値とは |
SHA-256のサンプル | |
MD5のサンプル |
ハッシュ値とは
ハッシュ値のイメージ: fdb481ea956fdb654afcc327cff9b626966b2abdabc3f3e6dbcb1667a888ed9a |
ハッシュ値は、文字列からハッシュ値へ変換した場合、そのハッシュ値から元の文字列に戻すことはできないという特徴があります。
使用例としてWEBシステムでユーザが入力したパスワードをハッシュ値にしてDBに保存し
再度ユーザがログインした時、入力されたパスワードをハッシュ値にしてDBにあるハッシュ値と比較し確認する等あります。パスワードをDBにそのまま保存するより良くなります。
また通常はソルト(salt:塩)を使用します。ソルトとは、元のデータに任意の文字列を付加してからハッシュ値にすることでセキュリティの強度を高めます。
さらに安全性を高める場合は、ストレッチング(ハッシュ値の計算を繰り返し行う)を行います。
以下は、MicroSoftのハッシュ値計算のリンクです。
https://docs.microsoft.com/ja-jp/troubleshoot/dotnet/csharp/compute-hash-values
SHA-256のサンプル
SHA-256は、256bitのハッシュ値(64桁)を出力します。よく使用されています。256以上が推奨です。
Imports System.Security.Cryptography
Imports System.Text
Module Module1
Sub Main()
Console.WriteLine(Class1.GetHashValue("あいうえお"))
'fdb481ea956fdb654afcc327cff9b626966b2abdabc3f3e6dbcb1667a888ed9a
Console.WriteLine(Class1.GetHashValue("あいうABC123"))
'eac7b740f6b015b37fcf86d3c7ca404caa84d1ab4ea2d9974d4ad0d410f38b9a
End Sub
End Module
Public Class Class1
Public Shared Function GetHashValue(str1 As String) As String
Dim ar1() As Byte = Encoding.UTF8.GetBytes(str1)
Dim ar2() As Byte =
New SHA256CryptoServiceProvider().ComputeHash(ar1)
' バイト配列 → 16進数文字列
Dim str2 As StringBuilder = New StringBuilder()
For Each b1 As Byte In ar2
str2.Append(b1.ToString("x2"))
Next
Return str2.ToString
End Function
End Class
6行目と9行目の文字数は異なりますが、出力される桁数は同じです。
MD5のサンプル
MD5は、128bitのハッシュ値(32桁)を出力します。安全性は低いです。
Imports System.Security.Cryptography
Imports System.Text
Module Module1
Sub Main()
Console.WriteLine(Class1.GetHashValue("あいうえお"))
'86deb27a32903da70a7b2348fcf36bc3
Console.WriteLine(Class1.GetHashValue("あいうABC123"))
'5275d678c4f68d2c2ff37c25c842378e
End Sub
End Module
Public Class Class1
Public Shared Function GetHashValue(str1 As String) As String
Dim ar1() As Byte = Encoding.UTF8.GetBytes(str1)
Dim ar2() As Byte =
New MD5CryptoServiceProvider().ComputeHash(ar1)
' バイト配列 → 16進数文字列
Dim str2 As StringBuilder = New StringBuilder()
For Each b1 As Byte In ar2
str2.Append(b1.ToString("x2"))
Next
Return str2.ToString
End Function
End Class
6行目と9行目の文字数は異なりますが、出力される桁数は同じです。
関連の記事