给定存储在 SHA-1/{SSHA} 中的 LDAP 密码,我将如何在 erlang 中验证它。
例如 - 给定以下 {SSHA}:
% slappasswd -s myPassword
{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP
%
我将如何(在 erlang 中)验证明文“myPassword”与“{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP”的散列值匹配。
使用BIND操作验证存储在目录服务器中的密码。正确配置和安全的目录服务器将不允许访问密码数据;因此,不能对 LDAP 客户端进行编码,期望密码数据可用,无论是加密的还是散列的。LDAP 客户端必须使用 BIND 操作来验证密码。
在其他人的帮助下,我想出了一个在 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>
谢谢大家。
麦克风
我的二郎很生锈,所以这不是很漂亮,但无论如何它可能让我的想法顺利。
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()
从 erlang 库运行。从中获取二进制输出,并将其转换为整数列表,然后将每个整数转换为十六进制字符串,然后将其连接起来,从而创建 Hash2。crypto:sha()
编辑:我没有你正在使用的这个命令,所以我不能真正彻底地尝试这个。但它适用于sha1sum
. 我希望他们是一样的!