【发布时间】:2015-02-18 11:57:31
【问题描述】:
我正在尝试在 Javascript 中获取以下 generate_hash erlang 函数返回的相同值
-define(b2l(V), binary_to_list(V)).
-define(l2b(V), list_to_binary(V)).
generate_hash(User, Secret, TimeStamp) ->
SessionData = User ++ ":" ++ erlang:integer_to_list(TimeStamp, 16),
Hash = crypto:sha_mac(Secret, SessionData),
base64:encode(SessionData ++ ":" ++ ?b2l(Hash)).
make_time() ->
{NowMS, NowS, _} = erlang:now(),
NowMS * 1000000 + NowS.
这个函数在erlang中是这样调用的:
Username = "username"
Secret = ?l2b("secret"),
UserSalt = "usersalt",
CurrentTime = make_time(),
Hash = generate_hash( ?b2l(UserName), <<Secret/binary, UserSalt/binary>>, CurrentTime).
我设法使用谷歌 CryptoJS 库来计算哈希,但是 base64 返回的值与 erlang 中返回的值不匹配。
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha1.js"></script>
function generate_hash(User, Secret, TimeStamp) {
var SessionData = User + ":" + parseInt(TimeStamp,16);
var hash = CryptoJS.HmacSHA1(Secret,SessionData);
return atob(SessionData + ":" + hash.toString())
}
var Hash = generate_hash( "username", "secret"+"usersalt", new Date().getTime())
alert(Hash);
【问题讨论】:
-
可能很傻,但你确定使用相同的时间戳
-
我尝试使用秒、毫秒和微秒,但结果总是与 erlang 中的不一样..
-
恐怕问题在于“>”在Erlang中的含义。恐怕它不等于简单的javascript字符串连接
-
@mlorini: 这个“>”代码正是你需要的,这就是连接。
标签: javascript erlang