Attribute System

ジャンク奇行。 ときどき ラクガキ。

SSHA ダイジェストを Windows で作る。

2017-01-26 23:42:46 | 研究&TIPS
 こんばんはヌキヲです。
今回は OpenLDAP のパスワードなどで使われる SSHA 方式のダイジェストを
Windows 上のコマンドプロンプトのみで生成するお話です。

背景から言うと PukiWiki でユーザアカウントを切ってもらうのに
パスワードのダイジェストもくれと言われたので、なんだそりゃ?となって調べました。

BugTrack/709 パスワードのフォーマットを選択可能に(LDAP互換に)


かみ砕いていうと SHA1 に SALT を付けた 24byte を base64 でエンコードすればいいらしいですね。
Windows 環境で手軽に生成できないものか調べたところ、
OpenSSL コマンドが Windows10 にも入っており、
また CertUtil が Base64 のエンコードに対応していましたので、バッチファイルにしてみました。

@echo off


IF %1 == "" GOTO END

openssl rand 4 > salt.temp
echo %1 > temp.$1
cat salt.temp >> temp.$1

cat temp.$1 | openssl dgst -sha1 -binary > temp.$2
cat salt.temp >> temp.$2
certutil -f -encode temp.$2 result.txt
cat result.txt

del -f salt.temp temp.$1 temp.$2


:END


です。
これを 適当な名前.cmd でフォルダに入れて、引数にパスワードを入れれば、
画面と result.txt に結果が出ます。
テンポラリファイルとか使うので結構危なげ?(笑



以下のサイト様を参考にしました。
素敵な情報ありがとうございます!

notepad.wiki > SSHA (Salted SHA-1) 形式のパスワードを生成したい

Eiji James Yoshidaの記録 > [メモ] Windowsでbase64エンコード・デコードする方法


□2017.02.05 追記。
上のままでは、SALT を毎回ランダムで生成してしまうので、
salt.bin ファイルが残っていれば、それを使うようにバージョンアップします。

@echo off


IF %1 == "" GOTO END

IF EXIST salt.bin GOTO DGST

openssl rand 4 > salt.bin

:DGST

echo %1 > temp.$1
cat salt.bin >> temp.$1

cat temp.$1 | openssl dgst -sha1 -binary > temp.$2
cat salt.bin >> temp.$2
certutil -f -encode temp.$2 result.txt
cat result.txt

del -f temp.$1 temp.$2


:END



はい、実際は 3行 増えて、ファイル名を変えただけです。
これで同じ SALT で何度も生成を試せます。

また、Base64 のデコードの方も作りました。

@echo off


IF %1 == "" GOTO END

echo %1 > temp.txt
certutil -f -decode temp.txt decode.bin
del temp.txt

:END


デコードされた decode.bin の先頭 20byte を削除すれば SALT が復元できますね。
で、これらを使って無事にログインできたか?
というのが一番重要だと思うのですが、実は失敗しています(笑
うーん、どっか間違ってるのかなぁ?

□2017.02.08 追記。
朗報!問題点がわかりました!!

Windows cmd.exe の echo は空白と改行を足してしまうのです。

@echo off


IF %1 == "" GOTO END

IF EXIST salt.bin GOTO DGST

openssl rand 4 > salt.bin

:DGST

SET /P XXX=%1<NUL > temp.$1
cat salt.bin >> temp.$1

openssl dgst -sha1 -binary -out temp.$2 temp.$1
cat salt.bin >> temp.$2
certutil -f -encode temp.$2 result.txt
cat result.txt

del -f temp.$1 temp.$2


:END


何ともマニアックなコマンドですね!
あと変更点は openssl の使い方をちょっと調べたところです。
断然すっきりしました。


さて、メデタシメデタシで終わろうと思ったのですが、
実はもっと簡単な生成方法があったのでお知らせします。

自身の Pukiwiki の TOP から index.php?cmd=md5 というページにアクセスすると、
なんとダイジェスト生成ページが現れます。
ディフォルトで SLAT 長は 8byte になるみたいですね。
なんて簡単なんだ!



参考は以下のサイト様です。

[Tips] Pukiwikiでパスワード設定

Qiita > 【バッチファイル】文字列を改行なしで表示【備忘録】
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ロボットアスリートCUP 2016.... | トップ | バッテリーが買えないぞ!? »
最新の画像もっと見る

コメントを投稿

研究&TIPS」カテゴリの最新記事