3

给定存储在 SHA-1/{SSHA} 中的 LDAP 密码,我将如何在 erlang 中验证它。

例如 - 给定以下 {SSHA}:

% slappasswd -s myPassword
{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP
%

我将如何(在 erlang 中)验证明文“myPassword”与“{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP”的散列值匹配。

4

3 回答 3

1

使用BIND操作验证存储在目录服务器中的密码。正确配置和安全的目录服务器将不允许访问密码数据;因此,不能对 LDAP 客户端进行编码,期望密码数据可用,无论是加密的还是散列的。LDAP 客户端必须使用 BIND 操作来验证密码。

于 2012-11-10T10:45:42.293 回答
1

在其他人的帮助下,我想出了一个在 Erlang 中执行此操作的例程。在这里跟大家分享。

首先 - 这个链接(在另一篇文章中找到)提供了其他语言的功能做我想要的:

诀窍是“ldap {SSHA}”编码是一个加盐SHA1哈希,也是base64编码的。所以 - 您必须对其进行解码,提取盐,然后在“清除密码”的重新编码中使用它进行比较。

这是一个简短的 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 库运行。从中获取二进制输出,并将其转换为整数列表,然后将每个整数转换为十六进制字符串,然后将其连接起来,从而创建 Hash2。
  • 将命令的输出与crypto:sha()

编辑:我没有你正在使用的这个命令,所以我不能真正彻底地尝试这个。但它适用于sha1sum. 我希望他们是一样的!

于 2012-11-09T23:17:29.953 回答