28
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PowerShellで生成したパスワードを暗号化して保存する

Last updated at Posted at 2017-01-12

前回書いた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

戻った!(๑•̀ㅂ•́)و✧

復号用スクリプトをGithubにあげてみました。

28
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?