【问题标题】:How to make Laravel Password hash using Javascript如何使用 Javascript 制作 Laravel 密码哈希
【发布时间】:2015-11-12 11:24:34
【问题描述】:

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

【问题讨论】:

  • 我认为我们需要更多信息,所以 laravel 是 php(您的帖子中缺少 php 标签),那么您的“移动应用程序”是什么?适用于哪个平台?然后你提到了一个网站。什么网站?您使用 laravel/php 输出移动应用程序接收数据的网站?
  • 我可以看看你到目前为止的代码吗?

标签: javascript php laravel bcrypt


【解决方案1】:

试图回答你模糊的问题(假设你正在寻找一个用于 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 = '$2y$07$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 验证 - 只需在前缀“$2y$10$”之后取前 22 个字符(盐是“saltsaltsaltsaltsaltse”这个例子):

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

更新

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

【讨论】:

  • 感谢您的回复。我试过这个 javascript 库。在这个库中有一些示例脚本。一种是根据哈希值验证密码。因此,如果我尝试根据我的数据库中的哈希值来验证密码,它会给我“无效的盐修订”警报。我不认为我在我的 laravel 应用程序中设置了任何盐。你有什么想法吗??
  • 你可以先点赞我的回答来表达你的感激之情。然后,我无法回答您的评论,因为我不知道 laravel 如何保存其哈希值,或者它是否使用上述 php 函数。您必须提供更多输入,例如,向我们展示您的完整哈希值。
  • 我认为您没有阅读我提到的 php 函数。如果你这样做了,你可以看到盐是由这些函数自动生成的!
  • 好的,我已经下载并使用了这个js库,哈希与密码匹配的方法不需要盐匹配。无论如何,我搜索了例外“无效的盐修订”并找到了这个答案github.com/ircmaxell/password_compat/issues/49。现在 PHP 生成的哈希可以通过将 $2y 替换为 $2a 来匹配使用这个 js 库,并且从这个 js 库生成的哈希可以通过将 $2a 替换为 $2y 来被 php 识别。所以我将您的答案标记为正确。您可以修改您的答案以包含此内容,以便任何人都可以在不阅读 cmets 的情况下解决它。
  • 我无法编辑我的评论,所以添加另一个。 js 库生成的哈希可以在不将@2a 替换为 $2y 的情况下进行验证。 PHP 以两种方式识别它们。亲爱的,谢谢你的帮助。
【解决方案2】:

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

现在我建议您通过在线方式对用户进行身份验证/注册,然后在离线模式下进行其他操作。在 6 或 7 天后定期检查身份验证。

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

注意Authentication should not be done on client side.

【讨论】:

  • 实际上应用程序会定期同步数据以获取更新的数据。更多的应用程序不是公共应用程序,而是仅供特定人员使用。它必须离线工作,因为在哪里使用这个应用程序,在那个地方,每次都不能保证互联网访问可用性。所以这是在离线模式下对当前用户进行身份验证的要求。
  • 我认为在这种情况下,移动应用程序不是一个2层的客户端-服务器架构,而应该是一个离线可用的独立应用程序。因此它应该为数据提供加密或保护,因此需要进行身份验证才能打开数据。这对我来说似乎完全没问题。
  • 好的,代替身份验证;在这种情况下应该使用加密
【解决方案3】:

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

首先使用请求数据从您的应用调用 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
                        ]);

 }

【讨论】:

  • 你没有完全理解这个问题。再读一遍问题和上面的答案。
猜你喜欢
  • 2020-02-25
  • 2016-02-07
  • 2017-11-30
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2015-12-18
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多