3

SHA-1 / {SSHA}に保存されているLDAPパスワードを考えると、erlangでどのように検証しますか。

たとえば、次の{SSHA}があるとします。

% slappasswd -s myPassword
{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP
%

クリアテキスト「myPassword」がハッシュ値「{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP」と一致することを(erlangで)どのように検証しますか?

4

3 に答える 3

1

ディレクトリサーバーに保存されているパスワードは、BIND操作を使用して検証されます。適切に構成され、保護されたディレクトリサーバーは、パスワードデータへのアクセスを許可しません。したがって、LDAPクライアントは、暗号化されているかハッシュされているかにかかわらず、パスワードデータが利用可能であることを期待してコーディングしてはなりません。LDAPクライアントは、BIND操作を使用してパスワードを検証する必要があります。

于 2012-11-10T10:45:42.293 に答える
1

他の人からの助けの後で、私は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> 

みんなありがとう。

マイク

于 2012-11-10T14:35:46.703 に答える
0

私のアーランはとても錆びているので、これはあまりきれいではありませんが、とにかく私の考えを理解しているかもしれません。

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)).

私の考えはあなたです:

  • 出力を検証したいコマンド(slappasswd)を実行し、出力を保存して、ハッシュの前にある余分な装飾を削除します。
  • crypto:sha()erlangライブラリから実行します。これからバイナリ出力を取得し、それを整数のリストに変換します。次に、それぞれを16進文字列に変換し、それを連結して、Hash2を作成します。
  • コマンドの出力をの出力と比較しますcrypto:sha()

編集:私はあなたが使用しているこのコマンドを持っていないので、私はこれを完全に試すことができませんでした..しかしそれはのために働きsha1sumます。それらが同じであることを願っています!

于 2012-11-09T23:17:29.953 に答える