SHA-1 / {SSHA}に保存されているLDAPパスワードを考えると、erlangでどのように検証しますか。
たとえば、次の{SSHA}があるとします。
% slappasswd -s myPassword
{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP
%
クリアテキスト「myPassword」がハッシュ値「{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP」と一致することを(erlangで)どのように検証しますか?
ディレクトリサーバーに保存されているパスワードは、BIND操作を使用して検証されます。適切に構成され、保護されたディレクトリサーバーは、パスワードデータへのアクセスを許可しません。したがって、LDAPクライアントは、暗号化されているかハッシュされているかにかかわらず、パスワードデータが利用可能であることを期待してコーディングしてはなりません。LDAPクライアントは、BIND操作を使用してパスワードを検証する必要があります。
他の人からの助けの後で、私はErlangでこれを行うためのルーチンを思いついた。他の人と共有するためにここでフォローアップします。
最初に-このリンク(別の投稿にあります)は、私が望んでいたことを実行する他の言語の関数を提供します:
秘訣は、「ldap {SSHA}」エンコーディングが、base64でエンコードされたsalted-SHA1ハッシュであるということでした。つまり、それをデコードし、ソルトを抽出してから、比較のために「クリアパスワード」の再エンコードに使用する必要があります。
これを行う短いErlangルーチンを次に示します。
validatessha(ClearPassword, SshaHash) ->
D64 = base64:decode(lists:nthtail(6, SshaHash)),
{HashedData, Salt} = lists:split(20, binary_to_list(D64)),
NewHash = crypto:sha(list_to_binary(ClearPassword ++ Salt)),
string:equal(binary_to_list(NewHash), HashedData).
私の元の投稿のデータを考えると、出力は次のとおりです。
67> run:validatessha("myPassword", "{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP").
true
68>
みんなありがとう。
マイク
私のアーランはとても錆びているので、これはあまりきれいではありませんが、とにかく私の考えを理解しているかもしれません。
run() ->
Password = "myPassword",
HashRaw = os:cmd("slappasswd -s " ++ Password),
Hash1 = lists:nthtail(6, HashRaw),
Hash2 = lists:concat ([integer_to_list(X, 16) || X <- binary_to_list(crypto:sha(Password))]),
string:equal(string:to_lower(Hash1),
string:to_lower(Hash2)).
私の考えはあなたです:
crypto:sha()
erlangライブラリから実行します。これからバイナリ出力を取得し、それを整数のリストに変換します。次に、それぞれを16進文字列に変換し、それを連結して、Hash2を作成します。crypto:sha()
編集:私はあなたが使用しているこのコマンドを持っていないので、私はこれを完全に試すことができませんでした..しかしそれはのために働きsha1sum
ます。それらが同じであることを願っています!