在Javascript中哈希密码返回未定义的结果

时间:2017-09-07 07:12:56

标签: javascript passwords

我会尽量详细说明,我对Javascript的细节不太满意,所以这可能是一个痛苦的基本问题。

我需要获取用户输入,哈希,然后发布。我目前正在使用麻省理工学院的bCrypt算法,我不必专门使用它,但它必须是客户端。 (顺便说一句,我知道像密码客户端这样的东西并不是一个好主意,我已经在SO上阅读了很多关于这个...但是出于这些目的,这只是一个练习。)

我可以生成salt,所以我从bCrypt.js文件成功调用了该函数,但是我遇到了使用哈希密码的问题。以前我能够获得密码哈希,但是无法在其他任何地方成功引用该变量或发布它。现在我把它搞砸了,甚至无法使哈希工作,它返回undefined(这就是为什么我需要养成使用版本控制的习惯)。

我的代码:



var ROUNDS = 10;

//	Function grabs username and password from user's input
//
function submitButton() {
  var userInput = document.getElementById('password').value;
  var userName = document.getElementById('username').value;

  hashPw(userInput, userName);
}

function result(hash) {
  console.log('hash in callback is ' + hash);
}

function hashPw(old, name) {
  console.log('hashPw called');
  console.log('old password= ' + old);

  var salt = gensalt(ROUNDS);
  hashpw(old, salt, result);
  console.log('Salt= ' + salt)
  console.log('hashed password=');

}

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>Hash</title>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
  <script src="bcrypt.js" type="text/javascript"></script>

</head>

<body>
  <form>
    <div class="form-group">
      <label>Username: </label>
      <input type="text" id="username" class="form-control">
    </div>
    <div class="form-group">
      <label for="password">Password: </label>
      <input type="text" id="password" class="form-control">
      <span></span>
    </div>
    <button type="button" class="btn btn-primary" onClick="submitButton()">Submit</button>
  </form>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
  <script src="callHash.js" type="text/javascript"></script>
</body>

</html>
&#13;
&#13;
&#13;

我的js:

这里发布的内容相当冗长,但这是我正在使用的bCrypt算法:https://github.com/nevins-b/javascript-bcrypt/blob/master/bCrypt.js

我一致得到的控制台输出示例:

callHash.js:18 hashPw called
callHash.js:19 old password= tryagain
callHash.js:23 Salt= $2a$10$AwGCCKs5bXa1SNzdKLBytO
callHash.js:24 hashed password=undefined

EDIT-- 无论我改变什么,这都是我一遍又一遍的:

bcrypt.js:467 [Violation] 'setTimeout' handler took 102ms

非常感谢您的任何帮助或建议,我确实在寻求指导之前尝试研究这个问题并进行了大量的排查,我已经重复了几次,所以我想我错过了一些东西这里很大很明显。

1 个答案:

答案 0 :(得分:0)

我假设您正在使用bcrypt的异步功能。 您可以使用同步功能(genSaltSync和hashSync),也可以阅读有关回调的内容。 我会建议第二个结果如下:

var bcrypt = require('bcryptjs');
bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash("B4c0/\/", salt, function(err, hash) {
        // Store hash in your password DB. 
    });
});

有关详细信息,请查看文档:{​​{3}}