如何使用 Javascript 生成 Laravel 密码哈希

How to make Laravel Password hash using Javascript

我有一个 laravel 网站,该网站使用 html css 和 js 将其所有数据传输到 Hybird 移动应用程序。移动应用程序在离线模式下工作。我必须在基于从网站传输的数据的移动设备中执行身份验证。但是 laravel 使用 bcrypt 散列。我如何制作类似的散列器来匹配 javascript 中的密码?是否可以在 javascript 中制作类似的散列器或者有人已经这样做了??

尝试回答您模糊的问题(假设您正在寻找 javascript 的 bcrypt 库):

1) 这里有一个 javascript 的 bcrypt 库: https://github.com/nevins-b/javascript-bcrypt 在这里找到: bCrypt implementation in Javascript

我会假设(但不确定)laravel 使用 php 内置函数 password_hash()password_verify(),从而输出一种特殊格式,其中包含像 php doc:

中的这个例子一样使用盐

$hash = 'y$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

您可以查看两者的 php 文档: https://secure.php.net/manual/en/function.password-verify.php https://secure.php.net/manual/en/function.password-hash.php

您需要修改哈希字符串,以便您可以在 javascript bcrypt 函数中使用它来验证您移动应用程序中用户提供的密码。

更新

盐存储在散列中,因此您可以提取它以进行 javascript 验证 - 只需取前 22 个字符 前缀“$2y$10”之后$"(在此示例中盐为 "saltsaltsaltsaltsaltse"):

echo password_hash('JohnDoe', PASSWORD_DEFAULT, ['salt' => 'saltsaltsaltsaltsaltse']);
# will output y$saltsaltsaltsaltsaltseQMyqgPkFxQ1hfP2yBcGxgbJZGe1uGXq

更新

感谢 hassans 的研究,发现 javascript 库与来自 phps password_hash() 的散列兼容,无需 拆分散列 and/or 单独提供盐。 为了避免 js 库中 php 生成的哈希值的 "Invalid salt revision" 错误,必须将 y 替换为 a哈希前缀。 php 无需替换即可使用 js 库中的哈希值。

我认为所有身份验证都应该在后端服务器上完成(在本例中使用 laravel)。您不应将您的用户信息传输到客户端移动应用程序以进行离线身份验证。可能会出现几个问题,机密数据可能会泄露,最近注册的用户信息可能不会出现在离线移动应用程序上等。

现在我会建议您authenticate/register 用户先在线,然后在离线模式下进行其他操作。 6 或 7 天后定期检查身份验证。

但是如果您仍然需要每个 bcrypt 算法都应该产生相同的散列,那么 here 是一个应该有所帮助的讨论。

注意Authentication should not be done on client side.

我认为您需要做的是 API 调用 bucrypt。

首先使用请求数据从您的应用调用 ajax

例如(使用jQuery):

var stringToHash = 'mypassword'; 
$.ajax({
   type: "GET",
   data:{password:stringToHash },
   success: function(response){
      console.log('here you get response');
     /*now the hash code*/
      console.log(response.data);

   }
});

在 Laravel api 控制器中(laravel 5)

public function hashPassword()
 {
      $hashPassword =  bcrypt(Input::get('password'));

      return response()->json([
                        'status' => 'success', 
                        'data' => $hashPassword
                        ]);

 }