给定存储在SHA-1/{SSHA}中的LDAP密码,我如何在erlang中验证它。
例如-给定以下{SSHA}:
% slappasswd -s myPassword
{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP
%如何(在erlang中)验证明文'myPassword‘是否与散列值'{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP’匹配。
发布于 2012-11-10 22:35:47
在其他人的帮助下,我想出了一个在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> 谢谢所有人。
麦克
发布于 2012-11-10 18:45:42
使用BIND操作验证存储在目录服务器中的密码。正确配置和安全的目录服务器将不允许访问密码数据;因此,在编码LDAP客户端时,不能期望密码数据可用,无论是加密的还是散列的。LDAP客户端必须使用绑定操作来验证密码。
发布于 2012-11-10 07:17:30
我的erlang非常生锈,所以这不是很漂亮,但也许它会让我的想法变得更好。
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。我希望他们是一样的!
https://stackoverflow.com/questions/13316670
复制相似问题