鉴于存储在SHA-1 / {SSHA}中的LDAP密码,我将如何在erlang中验证它。
例如 - 给出以下{SSHA}:
% slappasswd -s myPassword
{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP
%
我(在erlang中)如何验证明文'myPassword'是否与散列值'{SSHA} GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP'匹配。
答案 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)).
我的想法是你:
crypto:sha()
。从中获取二进制输出,并将其转换为整数列表,然后将每个整数转换为十六进制字符串,然后将其连接起来,从而创建Hash2。crypto:sha()
sha1sum
。我希望他们是一样的!