パスワードをハッシュ化（ソルト、ストレッチング）（VB.NET）

# この記事の注意事項
この記事は[こちらの記事](https://qiita.com/portfoliokns3/items/dac90ed7556ea242d608)の内容を修正した内容となります。

# 対処したこと
## パスワードのテキストフォームをマスク
テキストフォームを選択し、プロパティのPasswordCharにアスタリスクを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/1b3e7166-e8e7-ceed-2fb3-c7d3fc36bd13.png)
またはコード上で、以下のようにコードを書き、実行します。
```VB
txtPassword.PasswordChar = "*"
```
デバックすると、パスワードがマスクされていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/b7c61979-67cb-1c7b-0796-2e6130b21184.png)

## テキストの入力文字数の制限
テキストフォームを選択し、プロパティのMaxLengthに文字数を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/cc25d98f-61fc-de35-d8b5-a795493544ad.png)
またはコード上で、以下のようにコードを書き、実行します。
```VB
txtUserID.MaxLength = 8
```

## パスワードの表記
チェックボックスを追加し、チェックボックスの有無でパスワードを表記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/0be6be46-c876-c602-a71e-beb9ee80c038.png)
チェックボックスをON/OFFした際、パスワードの表記を制御するための処理を追加します。
```VB
    Private Sub ckbPassword_CheckedChanged(sender As Object, e As EventArgs) Handles ckbPassword.CheckedChanged
        If ckbPassword.Checked Then
            txtPassword.PasswordChar = ""
        Else
            txtPassword.PasswordChar = "*"
        End If
    End Sub
```

## パスワードのハッシュ化
パスワードをハッシュ化するクラスを作成します。メソッド内では、ソルトやストレッチングも行っています。なおSQL Server側で、パスワードの文字数を変更する必要があります。
```VB
Imports System.Security.Cryptography

''' <summary>
''' ハッシュ化装置
''' </summary>
Public Class clsCryptoHasher
    Private _getHushPassword As String
    Public ReadOnly Property getHushPassword() As String
        Get
            Return _getHushPassword
        End Get
    End Property
    Private saltSeed As String = System.Environment.GetEnvironmentVariable("DEV_SALT_SEED")
    Private stretchingTimes As Integer = System.Environment.GetEnvironmentVariable("DEV_STRETCHING_TIMES")

    ''' <summary>
    ''' ハッシュ化を計算する
    ''' </summary>
    ''' <param name="systemErrorFlag">システムエラーフラグ</param>
    ''' <param name="userID">ユーザーID</param>
    ''' <param name="password">パスワード</param>
    ''' <returns>システムエラーフラグ</returns>
    Public Function calcHushPassword(ByRef systemErrorFlag As Boolean, ByRef userID As String, ByRef password As String) As Boolean

        Try
            'ソルト化
            Dim saltPassword As String = String.Concat(userID, password, saltSeed)

            'ストレッチング
            For stretching = 1 To stretchingTimes
                'ハッシュ化
                If Me.generateHash(systemErrorFlag, saltPassword) Then Exit Try
            Next
            _getHushPassword = saltPassword

        Catch ex As Exception
            systemErrorFlag = True
            MessageBox.Show("エラーが発生しました： " & ex.Message)
        Finally
        End Try

        Return systemErrorFlag
    End Function


    ''' <summary>
    ''' ハッシュ化する
    ''' </summary>
    ''' <param name="systemErrorFlag">システムエラーフラグ</param>
    ''' <param name="password">パスワード</param>
    ''' <returns>システムエラーフラグ</returns>
    Private Function generateHash(ByRef systemErrorFlag As Boolean, ByRef password As String) As Boolean

        Try
            'パスワードをバイト配列に変換する
            Dim Bytes() As Byte = System.Text.Encoding.UTF8.GetBytes(password)

            'SHA256ハッシュアルゴリズムを使用してハッシュ値を計算する
            Dim sha256 As SHA256 = SHA256.Create()
            Dim hashBytes() As Byte = sha256.ComputeHash(Bytes)

            'ハッシュ値をBase64文字列に変換する
            password = Convert.ToBase64String(hashBytes)

        Catch ex As Exception
            systemErrorFlag = True
            MessageBox.Show("エラーが発生しました： " & ex.Message)
        Finally
        End Try

        Return systemErrorFlag
    End Function

End Class

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/6a20b20f-8197-7eb5-96af-6c05f373cf57.png)


# 注意事項
- この記事では、SQL Server、SSMS、visual studioを使用しているので、試してみたい方は事前に準備が必要です。
- 本記事に掲載されているコードは掲載用にサンプルとして掲載しているものです。したがって本記事を参考にし、コーディングを進める場合は作成しているアプリに応じて、各自で判断して、適応してください。
- 関連する記事の一覧は[こちら](https://qiita.com/portfoliokns3/items/7c789b7e1ba40500abbb#%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E6%89%B1%E3%81%A3%E3%81%A6%E3%81%84%E3%81%8D%E3%81%9F%E3%81%84%E4%BA%BA%E5%90%91%E3%81%91%E3%81%AE%E8%A8%98%E4%BA%8B)。
※参照先のリンクが切れている場合は、[トップページ](https://qiita.com/portfoliokns3)から確認してください。

# この記事は誰向けの記事か？
- ハッシュ化などについての実装コードを確認してみたい人
- ハッシュ化などの対処方法を一通り確認したい人

# 環境
- OS：Windows10
- [SQL Server](https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads)
- [SQL Server Management Studio（SSMS）](https://learn.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16):v19.0.2
- [visual studio 2022](https://visualstudio.microsoft.com/ja/vs/)
- [ChatGPT](https://chat.openai.com/chat)

# 本記事における注意事項
- 本記事は、備忘録としてまとめたものになります。
- 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
- また記載内容はすべて、正しい内容が記載されているとは限りません。
- 誤った内容を見つけた場合は、ご指摘をお願いいたします。
- この記事の内容では、一部、ChatGPTを利用しております。