« Baby Care Report ~お雛さん出したよ&節分編~ | トップページ | [VB.NET]文字列をチャンと暗号化する »

2009年2月 7日 (土)

[VB.NET]暗号乱数ジェネレータを使った厳密にランダムな文字列の生成

Visual Basic 言語リファレンスの「Rnd 関数」の「セキュリティに関するメモ」にも書かれていますが、ワンタイムパスワードなどランダムな文字列を生成する場合、「Rnd 関数」はランダムとは言えアルゴリズムを知ってると結果を予想することができるので「使用するな」と書かれています。

じゃ、どのように暗号に適した文字列を作成するかと言うと
「暗号化サービス プロバイダ」によって提供される「暗号乱数ジェネレータ」を使用して暗号的に厳密なランダム値を生成して、そこから文字列を生成します。

具体的なコードは以下の通りとなります。

ちなみにRollDice関数は、MSDNのRNGCryptoServiceProvider.GetBytes メソッドのサンプルをそのまま流用してたりします。(^^;A

Public Class RandomStringClass

    ''' <summary>
    ''' ランダムな文字列の生成
    ''' </summary>
    ''' <param name="intKeyLen">文字数</param>
    ''' <returns>ランダムな文字列(0~9、A~Z、a~zの組み合わせ)</returns>
    Public Shared Function CreateRandomString(ByVal intKeyLen As Integer) As String

        CreateRandomString = ""

        '指定の文字数になるまでランダムな文字を生成
        Dim strKey As String = ""
        Do Until Len(strKey) >= intKeyLen
            'ランダムな文字を生成
            Dim strKeyChar As String = Chr(RollDice(122 - 47) + 47)
            '数字・英字の範囲かチェック
            Select Case strKeyChar
                Case "0" To "9", "A" To "Z", "a" To "z"
                    strKey = strKey & strKeyChar
            End Select
        Loop

        CreateRandomString = strKey

    End Function

    ''' <summary>
    ''' 暗号サービス プロバイダの暗号乱数ジェネレータを使っての乱数の生成(MSのヘルプから引用)
    ''' </summary>
    ''' <param name="NumSides">出力値の最大値</param>
    ''' <returns>乱数(1~指定した最大値)</returns>
    Private Shared Function RollDice(ByVal NumSides As Integer) As Integer
        ' Create a byte array to hold the random value.
        Dim randomNumber(0) As Byte

        ' Create a new instance of the RNGCryptoServiceProvider.
        Dim Gen As New System.Security.Cryptography.RNGCryptoServiceProvider()

        ' Fill the array with a random value.
        Gen.GetBytes(randomNumber)

        ' Convert the byte to an integer value to make the modulus operation easier.
        Dim rand As Integer = Convert.ToInt32(randomNumber(0))

        ' Return the random number mod the number
        ' of sides.  The possible values are zero-
        ' based, so we add one.
        Return rand Mod NumSides + 1
    End Function 'RollDice

End Class

CreateRandomString関数の引数intKeyLenに必要な文字数を指定すれば、0~9・A~Z・a~zを組み合わせたランダムな文字列が返ってきます。

|

« Baby Care Report ~お雛さん出したよ&節分編~ | トップページ | [VB.NET]文字列をチャンと暗号化する »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/26493/27849834

この記事へのトラックバック一覧です: [VB.NET]暗号乱数ジェネレータを使った厳密にランダムな文字列の生成:

« Baby Care Report ~お雛さん出したよ&節分編~ | トップページ | [VB.NET]文字列をチャンと暗号化する »