前回書いたPowerShellでパスワード生成には続きがあります。
問題は生成したパスワードを忘れちゃうこと。なので、生成したパスワードを生成日時とともにログに残しましょう。とはいえ、プレーンテキストで残してしまうとパスワードの意味がありません。
SecureStringを介して暗号化する
WindowsにはSecureStringというものがあります。(よく理解していませんが…)
プレーンテキストを暗号化するためには一旦プレーンテキストをSecureStringに変換後、暗号化された文字列に変換します。これをログに残すことにしましょう。
例えば"password"という文字列を暗号化してみます。
(*'-') >> $secure = ConvertTo-SecureString "password" -AsPlainText -Force
(*'-') >> $secure
System.Security.SecureString
このようにマスクされて内容がわからなくなります。これをさらに暗号化された文字列に変換します。
(*'-') >> $encrypt = ConvertFrom-SecureString -SecureString $secure
(*'-') >> $encrypt
01000000d08c9ddf0115d1118c7a00c04fc297eb01000000f01bb26b297c5c49be1c148addfcc00f0000000002000000000003660000c0000000100000006e1b3680bc87a3956426cc8bf3c8f03c0000000004800000a000000010000000b932a8b7cc446dd1a5d7c28d88f106bb18000000c8ad080bc460351ab8a64fa1ec53b466a636fd3012b0b35e140000005f384b07721a9675ec72b8724574ab235792e5e8
暗号化された文字列が取得できました。
パスワードを生成日時とともにログに残す
前回のPowerShellでパスワード生成コードにちょいと付け足し。
$passwd=""
foreach ($n in 1..$(Get-Random -min 8 -max 16)) {
$passwd=$passwd+$(Get-Random -input 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)
}
$passwd
$encrypt=ConvertFrom-SecureString -SecureString (ConvertTo-SecureString $passwd -AsPlainText -Force)
(Get-Date -uformat "%Y/%m/%d %H:%M:%S")+" "+$encrypt >> ~/passwd.log
Get-Date
は-uformat
オプションを使うとunixのdate
コマンドと同様の書式で出力フォーマットを指定できるようになります。これと暗号化された文字列を1行にまとめて、ホームディレクトリ内のログファイルに追記してゆきます。
パスワードを復号する
当初の目的は パスワードを忘れないようにすること でした。自動生成できてらくちんでも、6ヶ月前に生成したパスワードが暗号化されていてなんだかわからないでは片手落ちです。
復号もまたConvertTo-SecureString
を使用します。先ほど$encrypt
に保存された暗号化された文字列を元の"password"に戻してみます。
(*'-') >> $decrypt = ConvertTo-SecureString -String $encrypt
(*'-') >> $decrypt
System.Security.SecureString
(*'-') >> $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($decrypt)
(*'-') >> $BSTR
42806504
(*'-') >> $plaintext = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($BSTR)
(*'-') >> $plaintext
password
戻った!(๑•̀ㅂ•́)و✧