背景:
大家好,我正在为网站使用AJAX登录功能,并且尝试使用Argon2 KDF(library)来从浏览器本身派生(某种程度上)资源密集型秘密用户提供的密码,然后将其发送到服务器进行验证。该站点使用TLS,所以我认为从安全角度讲这是一个有争议的问题,但是我宁愿客户端而不是服务器来完成这部分工作,这反而是一种学习经验,而不是生产站点。
问题:
示例代码正确计算了项目中的哈希,可以通过console.log(h.hashHex)
的输出进行验证,但是我尝试了数十种方法来尝试将值分配给变量,以便稍后在同一函数中使用。我意识到Promise是异步的,所以我确定我在有关线程的某个地方出错了。调试时,应为十六进制字符串的变量仍未定义或为optimized away。我确定我缺少一些简单的东西,但是看着类似的问题(1,2,3),我仍然无法使它正常工作并且没有太多的JavaScript经验。感谢您的输入!
示例代码(有效)
argon2.hash({ pass: $("#password").val(), salt: 'somesalt' })
.then(h => console.log(h.hash, h.hashHex, h.encoded))
.catch(e => console.error(e.message, e.code));
修改1(无效):
function do_login() {
...
var password;
argon2.hash({ pass: $("#password").val(), salt: 'somesalt' })
.then(h => {password=h.hashHex})
.catch(e => console.error(e.message, e.code));
...
}
修改2(也不起作用):
function submitLogin(email, pass) {
...
$.ajax
({
type:'post',
url:'/login',
data:{
do_login:"do_login",
email:email,
password:pass
},
success:function(response) {
...
}
});
}
function do_login()
{
var email=$("#username").val();
var password = $("#password").val();
argon2.hash({ pass: password, salt: 'somesalt' })
.then(h=> function(h){submitLogin(email,h.hashHex);return false;})
.catch(e => function(e){console.error(e.message, e.code);return false;});
}
更新(答案如下)
function submitLogin(email, pass) {
...
$.ajax
({
type:'post',
url:'/login',
data:{
do_login:"do_login",
email:email,
password:pass
},
success:function(response) {
...
}
});
}
function do_login()
{
var email=$("#username").val();
var password = $("#password").val();
argon2.hash({ pass: password, salt: 'somesalt' })
.then(h=>submitLogin(email,h.hashHex))
.catch(e => console.error(e.message, e.code));
return false;
}
答案 0 :(得分:2)
修改1 不起作用,因为password
将在以后返回do_login
之后异步设置。
修改2 由于出现错字而无法使用;你有
.then(h=> function(h){submitLogin(email,h.hashHex);return false;})
但是这同时使用了箭头功能h =>
和箭头function (h)
,都是您实际想要的两倍。这样应该可以更好地工作:
.then(h => { submitLogin(email, h.hashHex); })
(在下一行,catch
处理程序具有相同的错误,因此请同时进行更改。)