标签: bcrypt

使用Code Igniter存储密码最安全的方法是什么?

我正在为我当前的项目使用Code Igniter.

截至目前,我正在使用MD5进行密码散列,但我已经在很多地方阅读过,这样做并不是一个好习惯.

我该怎么办?

  1. 使用
  2. 或者我应该使用bcrypt

另外,如果建议使用bcrypt,那么如何将它与Code Igniter一起使用?

编辑

我把这些文件放进去了 application/libraries

  1. PasswordHash.php
  2. C/Makefile文件
  3. C/crypt_private.c

在我的控制器中,我使用此代码 -

$params = array(
       'phpass_hash_strength' => 8,
           'phpass_hash_portable' => FALSE
       );
$this->load->library('PasswordHash', $params);
$password = $this->passwordhash->HashPassword($pwd);
Run Code Online (Sandbox Code Playgroud)

我收到这些错误 -

A PHP Error was encountered

Severity: Notice

Message: Uninitialized string offset: 3

Filename: libraries/PasswordHash.php

Line Number: 116
Run Code Online (Sandbox Code Playgroud)
A PHP Error was encountered

Severity: Warning

Message: strpos() [function.strpos]: Empty delimiter

Filename: libraries/PasswordHash.php

Line Number: 116
Run Code Online (Sandbox Code Playgroud)

更新

现在PasswordHash.php使用SimpleLoginSecure删除了.

codeigniter salt password-protection bcrypt password-hash

12
推荐指数
2
解决办法
2万
查看次数

如何在MySQL的`encrypt`函数中使用`bcrypt`算法来验证密码?

我有$2y$10$zQaDT8hXM4pLmBdwN0xEseda/oKJAQKMKMzUrV8jbs6Epz28BXzBS密码(qwe)的加密值().但是,当我验证我得到错误的结果哈希值.

mysql> select '$2y$10$zQaDT8hXM4pLmBdwN0xEseda/oKJAQKMKMzUrV8jbs6Epz28BXzBS' = encrypt('qwe', '$2y$10$zQaDT8hXM4pLmBdwN0xEseda/oKJAQKMKMzUrV8jbs6Epz28BXzBS') as is_valid; 
+----------+
| is_valid |
+----------+
|        0 |
+----------+

select encrypt('qwe', '$2y$10$zQaDT8hXM4pLmBdwN0xEseda/oKJAQKMKMzUrV8jbs6Epz28BXzBS') as hash;
+---------------+
| hash          |
+---------------+
| $2tBKnsbV2Szg |
+---------------+
Run Code Online (Sandbox Code Playgroud)

md5 工作良好

mysql> select '$1$$.dCRcHz4ApIYzcA0g/qz3/' = encrypt('qwe', '$1$$.dCRcHz4ApIYzcA0g/qz3/') as is_valid; 
+----------+
| is_valid |
+----------+
|        1 |
+----------+
Run Code Online (Sandbox Code Playgroud)

如何添加bcrypt对MySQL的支持?

mysql encryption bcrypt

12
推荐指数
1
解决办法
3万
查看次数

在全球范围内要求Sails.js中的模块的最佳实践?

我目前正在构建我的Sails.js应用程序的身份验证部分,使用bcrypt哈希密码.一切都运作良好,这是迄今为止的实施示例:

beforeCreate: function (values, next) {

    require('bcrypt').hash(values.password, 10, function passwordEncrypted(err, encryptedPassword) {

        if (err) return next(err);

        values.password = encryptedPassword;
        next();

    });

}
Run Code Online (Sandbox Code Playgroud)

现在,无论是我model和我的controller,我都在使用require('bcrypt'),var bcrypt = require('bcrypt');所以我可以在课堂上使用它.

我正在寻找一种更好的实践方式来定义var bcrypt = require('bcrypt');一次和全局,以便我可以随时使用bcrypt变量(在其他模型或控制器内).

我倾向于认为Sails.js已经有了适当的东西吗?如果没有,您建议最佳实施方式是什么?最后,我正在寻找最佳实践.

提前致谢!

javascript bcrypt sails.js

12
推荐指数
1
解决办法
7011
查看次数

密码哈希+盐如何工作

我虽然理解哈希和盐渍密码,但似乎我有一些误解.我正在nodejs中为我的网站创建一个用户帐户系统.

我理解的方式是,当用户创建密码时,我们生成一个随机盐,将其附加到密码然后散列该字符串.我们还可以添加一个工作因子来使哈希缓慢工作并防御暴力攻击.我们将salt与哈希一起存储在我们的数据库中,并验证登录尝试,我们使用存储的salt和尝试的密码重复上述过程(在服务器上),并检查哈希值是否匹配.

似乎bcryptnodejs 中的模块与我对散列的解释不一致.这是来自http://codetheory.in/using-the-node-js-bcrypt-module-to-hash-and-safely-store-passwords/的示例

var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync("my password", salt);
Run Code Online (Sandbox Code Playgroud)

首先,为什么工作因素应用于盐而不是哈希?如果有人通过暴力攻击他们会运行哈希函数是否正确?哈希不是我们需要慢的函数吗?

我也对bcrypt的验证感到困惑:

bcrypt.compareSync("my password", hash);
Run Code Online (Sandbox Code Playgroud)

我们需要哈希是唯一的,即使两个用户选择相同的密码,这是盐的权利吗?那我们为什么不这样做呢?

bcrypt.compareSync("my password"+salt, hash);
Run Code Online (Sandbox Code Playgroud)

hash salt bcrypt node.js

11
推荐指数
2
解决办法
5731
查看次数

BCrypt:如何确定两个哈希是否引用相同的密码

我想知道如果每次运行生成的哈希值不同,BCrypt如何推断输入密码的正确性?

例:

给定密码:"password123"

可以说,我将给定密码哈希10次并收到:

$2a$10$Uw0LDj343yp1tIpouRwHGeWflT3.QjDp9DeJ2XiwTIHf1T.pjEy0i
$2a$10$uYWUCEnh4gn00w57VSrYjej.UvhzBL8Wf2doTAGSGfhUMtuGr5bha
$2a$10$cJi3XOkRxxicDjEBibNhNOg5MGM.G/.p70KE75.44ayPQo8kCDxUu
$2a$10$qLcN2obMThH544U967JM5OS0vtcfP.Iq1.f0mZdvWfyeIoWHyr422
$2a$10$5/JssXqJyGHeMQlB4pr7zebTRFSt/2iwYJHF5f7.jdlTxbH4c9Sjq
$2a$10$La1UQKu306aNWkhhfhC5XeX7mfcnfbSchBIpLG6O57gur/U/n/fua
$2a$10$xTzEGVfc1D1UHFeMO95ktOJGFT79ybKUKN.z.MidMjP1XfAeElNEi
$2a$10$i9Y.1Ix6PL1bDwoTYtC49.Y0LKpar/S5qC1SkzFB4vnafikOhHSga
$2a$10$FJNTj5xeVbIcMaf9EhodHu9jJLrJL53QHQK9OuemwMh3WuTfxXEqu
$2a$10$OXMToK5CXeNtRHC3w7eqe.Mr7p4fJanbE28E2Y3MHh6f6cq1chyE6
Run Code Online (Sandbox Code Playgroud)

如果我们假设我将第一个哈希存储在我的数据库中,并且用户尝试使用正确的密码几小时后登录.在用户尝试登录时生成的哈希与我在数据库中存储的哈希完全不同.

BCrypt如何确定这两个哈希是否引用相同的密码?

hash blowfish bcrypt

11
推荐指数
1
解决办法
6651
查看次数

如何比较laravel中的两个加密(bcrypt)密码

如何比较两个bcrypt密码

$pass1 = '$2y$10$ooPG9s1lcwUGYv1nqeyNcO0ccYJf8hlhm5dJXy7xoamvgiczXHB7S';
Run Code Online (Sandbox Code Playgroud)

$pass2 = '$2y$10$QRgaiS6bpATKKQeT22zGKuHq.edDfXQc2.4B3v.zaN.GtGwoyQuMy';
Run Code Online (Sandbox Code Playgroud)

$ pass1和$ pass2都是'test'的bcrypt.

我如何检查平等.没有像这样使用文本'test'

$hash1 = Hash::make('test');
$hash2 = Hash::make('test');

var_dump(Hash::check('test', $hash1) && Hash::check('test', $hash2));
Run Code Online (Sandbox Code Playgroud)

php bcrypt laravel laravel-5

11
推荐指数
3
解决办法
2万
查看次数

了解如何在bcrypt password_hash中生成/使用salt

我正在开发一个用于用户身份验证的现有Symfony2.8 Web应用程序项目FOSUserBundle.

除了Web前端,用户还可以使用不同的智能手机客户端使用REST API连接到Web应用程序.因此,在直接登录Web应用程序和连接REST API的原因时,用户都需要进行身份验证.

直到其中一个最新FOSUserBundle更新bcrypt密码哈希和用于salt存储在数据库中的地方.

使用REST API进行连接时,会将salt传输到客户端,以使用相同的salt对密码进行本地哈希处理.散列密码将发送回Web应用程序进行身份验证.

我知道发送散列密码而不是纯文本不会增加(很多)额外的安全性,因为只能使用HTTPS进行通信.然而,这是客户端工作的方式:他们需要salt来生成哈希密码.我可以在将来更新客户端,但现在这只是工作方式.

问题: 他们的方式FOSUserBundle哈希密码已经改变:因为不考虑手动指定盐而是让PHP自动生成盐(在PHP 7中甚至不能手动设置盐),手册盐不再受支持.

直接登录Web应用程序时没有问题,但由于REST客户端仍需要salt,因此此更新会中断REST连接.

有没有办法结合这两种方法?让PHP自动创建盐,提取并将此盐发送给客户端?

据我所知,salt与哈希存储在同一个字符串中:

在此输入图像描述

但是,只需从哈希字符串中复制21个char盐并将这些发送到客户端就不起作用了.似乎这21个字符足以测试/验证密码,但不能重新创建哈希.它是否正确?

那么,是否有任何解决方案使用PHP password_hash而不设置盐,并同时了解用过的盐?

编辑1:

回答@RiggsFolly问题:MD5在任何时候都没有使用过.这是正确的,bcryp/ password_hash不会两次创建相同的哈希.如果密码和盐都相同,它会这样做:

$s = 'password';
$salt = 'salt5678901234567890123456789012';

$options['salt'] = $salt;
$h1 = password_hash($s,PASSWORD_BCRYPT,$options);
$h2 = password_hash($s,PASSWORD_BCRYPT,$options);

echo $h1 . PHP_EOL;
echo $h2 . PHP_EOL;
Run Code Online (Sandbox Code Playgroud)

结果:

$2y$10$salt56789012345678901uTWNlUnhu5K/xBrtKYTo7oDy8zMr/csu
$2y$10$salt56789012345678901uTWNlUnhu5K/xBrtKYTo7oDy8zMr/csu
Run Code Online (Sandbox Code Playgroud)

password_hash如果未指定salt,将为相同的密码创建新哈希.这是因为,盐将随机创建,而不是每次调用时产生不同的盐.

编辑2:

正如编辑1中所见,使用具有32个字符的盐将导致字符串仅包含盐的前21个字符.但是,这个salt-prefix不能用于重新创建相同的哈希值,因为它太短而不能被接受.

但是,如果前缀填充0,它似乎工作:

$s = 'password';
$salt        = 'salt5678901234567890123456789012';
$salt_prefix = 'salt5678901234567890100000000000'; …
Run Code Online (Sandbox Code Playgroud)

php hash bcrypt symfony php-password-hash

11
推荐指数
1
解决办法
877
查看次数

Bcrypt Elastic beanstalk nodejs 部署

我正在尝试将我的 nodejs 后端与 codeship 部署到弹性 beantalk。但每次我收到以下错误:

bcrypt@1.0.3 install /tmp/deployment/application/node_modules/bcrypt
node-pre-gyp install --fallback-to-build

module.js:471
throw err;
^

Error: Cannot find module '../'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/tmp/deployment/application/node_modules/.bin/node-pre-gyp:15:20)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)

npm ERR! Linux 4.9.62-21.56.amzn1.x86_64
npm ERR! argv "/opt/elasticbeanstalk/node-install/node-v6.11.5-linux-x64/bin/node" "/opt/elasticbeanstalk/node-install/node-v6.11.5-linux-x64/bin/npm" "--production" "rebuild"
npm ERR! node v6.11.5
npm ERR! npm v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! bcrypt@1.0.3 install: `node-pre-gyp install …
Run Code Online (Sandbox Code Playgroud)

bcrypt node.js continuous-deployment amazon-elastic-beanstalk

11
推荐指数
3
解决办法
1957
查看次数

错误:无法为使用 PEP 517 且无法直接安装的 bcrypt 构建轮子

由于某种原因,pycharm 中的解释器配置无效,因此我为我正在处理的项目创建了一个新的虚拟环境,并再次安装了依赖项。但是我在再次安装 bcrypt 时遇到了麻烦。这是完整的错误。该项目在以前的解释器上运行良好,所以我怀疑 python 版本与它有什么关系。我尝试安装轮子以及错误所说的那样,could not build wheels但这也没有起到作用。

完整的错误:

Collecting flask-bcrypt
      Using cached https://files.pythonhosted.org/packages/1d/c0/6d4c04d007d72b355de24e7a223978d1a95732245f
    9e9becbf45d3024bf8/Flask-Bcrypt-0.7.1.tar.gz
    Requirement already satisfied: Flask in c:\users\User\appdata\local\programs\python\python38-3
    2\lib\site-packages (from flask-bcrypt) (1.1.2)
    Collecting bcrypt (from flask-bcrypt)
      Using cached https://files.pythonhosted.org/packages/d8/ba/21c475ead997ee21502d30f76fd93ad8d5858d19a3
    fad7cd153de698c4dd/bcrypt-3.2.0.tar.gz
      Installing build dependencies ... done
      Getting requirements to build wheel ... done
        Preparing wheel metadata ... done
    Requirement already satisfied: Jinja2>=2.10.1 in c:\users\User\appdata\local\programs\python\p
    ython38-32\lib\site-packages (from Flask->flask-bcrypt) (2.11.2)
    Requirement already satisfied: Werkzeug>=0.15 in c:\users\User\appdata\local\programs\python\p
    ython38-32\lib\site-packages (from Flask->flask-bcrypt) (1.0.1)
    Requirement already satisfied: itsdangerous>=0.24 in c:\users\User\appdata\local\programs\pyth
    on\python38-32\lib\site-packages …
Run Code Online (Sandbox Code Playgroud)

python bcrypt pycharm

11
推荐指数
1
解决办法
4万
查看次数

Node 的 bcrypt 和 bcryptjs 库有何不同?

我需要在 Node 中使用 bcrypt,像往常一样,有 27 个无数的库可供选择。

npm 上的两个顶级包是

  • bcrypt 247k 下载量/月
  • bcryptjs 337k 下载量/月
  • (还有什么要考虑的吗?)

它们有何不同?是否有令人信服的理由或用例来使用其中一个?

显然,一个是纯 JS,另一个绑定到本地 C++ 加密库。所以后者比前者

我读过应该选择最慢算法最快实现。所以这意味着我应该选择非 JS 的。然而,JS 更受欢迎。为什么在 node 中会出现这种情况——“纯 js”包比使用 node-gyp 绑定到本机库的包更可取有什么原因吗?

javascript encryption bcrypt node.js

10
推荐指数
1
解决办法
5824
查看次数