我正在为我当前的项目使用Code Igniter.
截至目前,我正在使用MD5进行密码散列,但我已经在很多地方阅读过,这样做并不是一个好习惯.
我该怎么办?
另外,如果建议使用bcrypt,那么如何将它与Code Igniter一起使用?
我把这些文件放进去了 application/libraries
在我的控制器中,我使用此代码 -
$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删除了.
我有$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的支持?
我目前正在构建我的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已经有了适当的东西吗?如果没有,您建议最佳实施方式是什么?最后,我正在寻找最佳实践.
提前致谢!
我虽然理解哈希和盐渍密码,但似乎我有一些误解.我正在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) 我想知道如果每次运行生成的哈希值不同,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如何确定这两个哈希是否引用相同的密码?
如何比较两个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) 我正在开发一个用于用户身份验证的现有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) 我正在尝试将我的 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
由于某种原因,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)