erlang SSHA ldap

erlang SSHA ldap,erlang,ldap,sha1,Erlang,Ldap,Sha1,给定存储在SHA-1/{SSHA}中的LDAP密码,我将如何在erlang中验证它 例如,给定以下{SSHA}: % slappasswd -s myPassword {SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP % 我(在erlang中)如何验证明文“myPassword”与散列值“{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP”匹配。我的erlang非常生锈,所以这不是很漂亮,但可能还是得到了我的想法 run() ->

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

例如,给定以下{SSHA}:

% slappasswd -s myPassword
{SSHA}GEH5kMEQZHYHS95dgr6KmFdg0a4BicBP
%

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

我的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)).
run()->
Password=“myPassword”,
HashRaw=os:cmd(“slappasswd-s”++密码),
Hash1=列表:nThail(6,HashRaw),

Hash2=列表:concat([整数到列表(X,16))| | X使用该操作验证目录服务器中存储的密码。正确配置和安全的目录服务器将不允许访问密码数据;因此,对LDAP客户端进行编码时,不得期望密码数据可用(无论是加密的还是散列的)。LDAP客户端必须使用绑定操作验证密码单词。

在他人的帮助下,我想出了一个在Erlang中执行此操作的例行程序。下面与其他人分享

首先-此链接(在另一篇文章中找到)提供了其他语言的函数,可以实现我想要的功能:

诀窍是“ldap{SSHA}”编码是一个salted-SHA1散列,也是base64编码的。因此-您必须对其进行解码,提取salt,然后在“清除密码”的重新编码中使用它进行比较

下面是一个简短的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> 
谢谢


Mike

明白-我们希望在ldap之外验证这些ssha加密密码-因此我的问题。