Home > Windows にまつわる e.t.c.

PowerShell で指定サイズのランダムな文字列/バイナリ列を生成する


パスワード生成するとかでランダムな文字列を PowerShell で作るには以下のようにします。
(PowerShell 6.0(正確には .NET Core 2.0) で System.Web.Security がサポートされなくなったので、System.Security.Cryptography.RNGCryptoServiceProvider で書き直しました。書き直し前のコンテンツはこちら)

##################################################
# ランダム文字列生成
##################################################
function CreateRandomString(
            [int]$ByteSize,             # 生成する文字数
            [switch]$RejectExtendMark,  # 拡張記号を除く
            [switch]$RejectBaseMark,    # 基本記号を除く
            [switch]$RejectAlphabet     # アルファベットを除く
        ){
    # アセンブリロード
    Add-Type -AssemblyName System.Security

    # ランダム文字列にセットする値
    $BaseString = '1234567890'
    $Alphabet = 'ABCDEFGHIJKLNMOPQRSTUVWXYZabcdefghijklnmopqrstuvwxyz'
    $BaseMark = '!.?+$%#&*=@'
    $ExtendMark = "'`"``()-^~\|[]{};:<>,/_"

    # アルファベット
    if( $RejectAlphabet -ne $true ){
        $BaseString += $Alphabet
    }

    # 拡張記号
    if( $RejectExtendMark -ne $true ){
        $BaseString += $ExtendMark
    }

    # 基本記号
    if( $RejectBaseMark -ne $true ){
        $BaseString += $BaseMark
    }

    # 乱数格納配列
    [array]$RandomValue = New-Object byte[] $ByteSize

    # オブジェクト 作成
    $RNG = New-Object System.Security.Cryptography.RNGCryptoServiceProvider

    # 乱数の生成
    $RNG.GetBytes($RandomValue)

    # 乱数を文字列に変換
    $ReturnString = ""
    $Max = $BaseString.Length
    for($i = 0; $i -lt $ByteSize; $i++){
        $ReturnString += $BaseString[($RandomValue[$i] % $Max)]
    }

    # オブジェクト削除
    $RNG.Dispose()

    return $ReturnString
}

 

スクリプトにして GitHub に公開しましたので、Clone するか Invoke-WebRequest してください。

MuraAtVwnet/CreateRandomString: パスワード作成スクリプト

https://github.com/MuraAtVwnet/CreateRandomString
git@github.com:MuraAtVwnet/CreateRandomString.git

Invoke-WebRequest https://raw.githubusercontent.com/MuraAtVwnet/CreateRandomString/master/CreateRandomString.ps1 -OutFile ~\CreateRandomString.ps1

 

暗号とかのセッションキーで使う場合、ランダム文字列だと印字可能キャラクターにしかならないので本当の意味でのランダム値にはなりません。

そんな場合は、乱数そのものを使います(byte配列が戻り値)

##################################################
# セッション鍵生成
##################################################
function CreateRandomKey( [int]$BitSize ){
    if( ($BitSize % 8) -ne 0 ){
        echo "Key size Error"
        return $null
    }
    # アセンブリロード
    Add-Type -AssemblyName System.Security

    # バイト数にする
    $ByteSize = $BitSize / 8

    # 乱数格納配列
    [array]$KeyBytes = New-Object byte[] $ByteSize

    # オブジェクト 作成
    $RNG = New-Object System.Security.Cryptography.RNGCryptoServiceProvider

    # 鍵サイズ分の乱数を生成
    $RNG.GetBytes($KeyBytes)

    # オブジェクト削除
    $RNG.Dispose()

    return $KeyBytes
}

 

関連情報

関数を PowerShell プロンプトで実行する
http://www.vwnet.jp/Windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm

AES 256 の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/AES.htm

SHA-2(SHA256) の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/SHA256.htm

RSA 公開鍵暗号の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/RSACrypto.htm

RSA 電子署名(SHA256)の PowerShell 実装
http://www.vwnet.jp/Windows/PowerShell/RSASignature.htm

PowerShell で公開鍵方式暗号ファイルを交換をする
http://www.vwnet.jp/Windows/PowerShell/PublicKeyCrypto.htm

PowerShell スクリプト引数(Param)の Tips
http://www.vwnet.jp/Windows/PowerShell/Param.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.