#Qiita初投稿!!
初めてのqiita投稿、今まで読むだけだった私が記事を書いてみた。
#概要
Have I Been Pwned?でパスワードを送信せずにパスワード流出を確認できるスクリプトを書いてみた。
#作ったものと動機
以前から巷で有名なパスワードの漏洩を入力のみで確認できるサイト( https://haveibeenpwned.com/ )は存在が、パスワードをWeb上で入力し、送信するのには抵抗があった人も多いのではないだろうか?
そんなときにこんな記事を目にした。
Have I Been Pwned?でパスワードを入力せずに漏洩を調べる方法 | マイナビニュース
https://news.mynavi.jp/article/20190625-848118/
この記事によると、送信するのはパスワードではなく、パスワードをハッシュ化したハッシュ値の先頭5文字を送信する。
送信後、先頭5文字分に該当するハッシュ値のリストが取得できるため、ローカルにて先頭5文字以降のハッシュ値が含まれているか確認し、あれば流出していると言うことになる。
この方法であれば、自分が使用しているパスワードが外部に送信されることなく、安全に確認することができる。
しかし、記事に書かれていた方法ではLinuxコマンドを知っており、使えるような人でないと調べることができずもっと簡単に使えるようなソフトウェアがあれば、と言うことで作ってみた。
#作ってみた
$pw =(Read-Host パスワードを入力してください -AsSecureString)
$encpw = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pw)
$decpw = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($encpw)
$str1 = (([string]::concat(([security.cryptography.SHA1]::create().computehash([text.encoding]::ascii.getbytes($decpw))|%{ $_.tostring("x2")}))).ToUpper().Substring(0, 5))
$str2 = (([string]::concat(([security.cryptography.SHA1]::create().computehash([text.encoding]::ascii.getbytes($decpw))|%{ $_.tostring("x2")}))).ToUpper().Substring(6, 34))
[System.Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11
$api = (curl https://api.pwnedpasswords.com/range/$str1)
if($api | select-string -CaseSensitive $str2 ){
echo "`r`n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`r`n 流出しています。`r`n 直ちにパスワードを変更してください`r`n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`r`n"
}else{
echo "`r`n流出していません`r`n"
}
echo "終了するには何かキーを押してください . . ."
$host.UI.RawUI.ReadKey()
powershell -ExecutionPolicy RemoteSigned .\PasswordCheck.ps1
使い方
Start.batを起動し、調べたいパスワードを入力してEnterを押すと流出しているかどうか分かります。
#参考
Have I Been Pwned?
Validating Leaked Passwords with k-Anonymity
Have I Been Pwned?でパスワードを入力せずに漏洩を調べる方法 | マイナビニュース
Windows OS 上で文字列の SHA256 ハッシュ値を求める方法