erlang SSHA ldap

时间:2012-11-09 22:01:05

标签: erlang ldap sha1

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

例如 - 给出以下{SSHA}:

% slappasswd -s myPassword
{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP
%

我(在erlang中)如何验证明文'myPassword'是否与散列值'{SSHA} GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP'匹配。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在其他人的帮助下,我想出了一个在Erlang中做这个的例行程序。跟进此处与他人分享。

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

诀窍是'ldap {SSHA}'编码是salted-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> 

Thanx all。

麦克

答案 2 :(得分: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),保存输出并修剪哈希前的额外装饰。
  • 从erlang库运行crypto:sha()。从中获取二进制输出,并将其转换为整数列表,然后将每个整数转换为十六进制字符串,然后将其连接起来,从而创建Hash2。
  • 将命令的输出与crypto:sha()
  • 的输出进行比较
编辑:我没有你正在使用的这个命令,所以我不能非常彻底地尝试这个...但它适用于sha1sum。我希望他们是一样的!