2016-09-09 9 views
1

A構文とsecurestringを作成することである -パスワードsecurekeyをConvertTo-SecureStringため

をConvertTo-SecureString [-string] [[-SecureKey]]

私が作成し、これを使用したいですDPAPIではなくユーザーのパスワードに基づく安全な文字列です。

そう私は、次のコード

$key = New-Object byte[](32) 
$rng = [System.Security.Cryptography.RNGCryptoServiceProvider]::Create() 
$rng.GetBytes($key) 

とsecurekeyを作成することができるが、ドキュメント

に係る有効なキーの長さは16、24、及び32バイト

ありますそのサイズに収まるようにパスワードを入力するのが難しくなります。

"correcthorsebatterystaple"を32byteのキーに変換するにはどうすればよいですか? (私は別のマシンに行き、同じパスワードを使って安全な文字列を解読できるように)

+0

固定長の暗号化キーを使用するにはちょっと変わったところがありますか?しかし、あなたMD5ハッシュすることができます - その出力は32バイトです。例えばhttp://stackoverflow.com/a/10521162/478656 - 私はそれがセキュリティの観点からは素晴らしい考えではないと考えていますが、新しいSHAハッシュは32バイトではありませんか? – TessellatingHeckler

+0

@TessellatingHeckler私の研究の一環としてこれを理解する!それはAES標準の一部であるようです - 128,192または256ビットのキー長が可能です。理論はあなたが塩を作り、パスワードと一緒にそれをクランチしてから鍵を得ることだと思われます。 –

+0

PBKDF、bcrypt、またはscryptを調べますが、私はまだ答えを出すコードを持っています。 – dandavis

答えて

2

これはうまくいくようです!

$salt = "Page-Yet-Rock-Food-Also-Fear-Blind-Rub-Letter-4" # courtesy of correcthorsebatterystaple.net 
$iterations = 1000 

$plaintext = ConvertTo-Json -InputObject $ObjectToEncrypt 
$saltBytes = [Text.Encoding]::Unicode.GetBytes($salt) 

$password = "Bedroom-Woman-Spoon-Quarrel-7" 

$deriveBytes = new-Object Security.Cryptography.Rfc2898DeriveBytes($password,$saltBytes ,$iterations) 
$key = $deriveBytes.GetBytes(32) 

$SecureString = ConvertTo-SecureString -String $StringToDecrypt -Key $key 

Rfc2898DeriveBytes

Rfc2898DeriveBytesの文書によると、パスワード、塩、および繰り返し回数を取り、その後、GetBytesメソッドの呼び出しによってキーを生成します。
RFC 2898には、パスワードと塩からキーと初期化ベクトル(IV)を作成するためのメソッドが含まれています。パスワードベースのキー導出関数であるPBKDF2を使用すると、事実上無制限の長さのキーを生成できる疑似ランダム関数を使用してキーを導出できます。 Rfc2898DeriveBytesクラスを使用すると、ベースキーなどのパラメータから派生キーを生成できます。パスワードベースのキー導出関数では、ベースキーはパスワードであり、他のパラメータはソルト値および反復カウントである。

関連する問題