最近我一直试图在我在互联网上偶然发现的登录脚本中实现我自己的安全性.在努力学习如何制作我自己的脚本为每个用户生成一个盐之后,我偶然发现了password_hash.
根据我的理解(基于本页的阅读:http://php.net/manual/en/faq.passwords.php),当您使用password_hash时,已经在行中生成了salt.这是真的?
我的另一个问题是,含有2种盐是不是很聪明?一个直接在文件中,一个在DB中?这样,如果有人在数据库中泄露了你的盐,你仍然直接在文件中?我在这里读到,存储盐绝不是一个明智的想法,但它总是让我困惑的是人们的意思.
假设我想为用户存储密码,这是使用PHP 5.5的password_hash()功能(或者这个版本的PHP 5.3.7+:https://github.com/ircmaxell/password_compat)的正确方法吗?
$options = array("cost" => 10, "salt" => uniqid());
$hash = password_hash($password, PASSWORD_BCRYPT, $options);
Run Code Online (Sandbox Code Playgroud)
然后我会这样做:
mysql_query("INSERT INTO users(username,password, salt) VALUES($username, $hash, " . $options['salt']);
Run Code Online (Sandbox Code Playgroud)
要插入数据库.
然后验证:
$row = mysql_fetch_assoc(mysql_query("SELECT salt FROM users WHERE id=$userid"));
$salt = $row["salt"];
$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10, "salt" => $salt));
if (password_verify($password, $hash) {
// Verified
}
Run Code Online (Sandbox Code Playgroud) 所以我听说PHP 7.2引入了新的Argon2算法.但我对如何将其与现有代码一起使用感到困惑.例如,我有这个
$password = password_hash('somepassword', PASSWORD_DEFAULT, ['cost' => 12]);
Run Code Online (Sandbox Code Playgroud)
难道PASSWORD_DEFAULT现在使用Argon2?如果有的话,我需要改变password_verify什么?bcrypt现在被认为是不安全的吗?
我正在localhost上运行php版本5.4.16,而我正在开发我的网站.我想用password_hash(),但我一直收到这个错误:
致命错误:在第123行的/dir/to/file.php中调用未定义的函数password_hash()
为什么会这样?
谢谢!
php password-hash password-encryption undefined-function php-password-hash
我的php代码生成一个哈希,password_hash用于存储在数据库中.以下是PHP代码:
$hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost));
Run Code Online (Sandbox Code Playgroud)
我想在nodejs中针对此哈希验证/检查密码.
我看到了很多节点模块(bcrypt,phpass,node-bcrypt),但是所有节点模块都给我错误.下面是在php中生成的示例哈希,我试图在nodejs中验证.
var hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2';
var bcrypt = require('bcrypt');
bcrypt.compare("secret", hash, function(err, res) {
console.log(res);
});
Run Code Online (Sandbox Code Playgroud)
(这里的秘密是真实的密码)
我目前的解决方法是通过节点调用php脚本来验证(对于需要解决方法的任何人)
var exec = require('child_process').exec;
var cmd = 'php verify.php password encryped_pasword';
exec(cmd, function (error, stdout, stderr) {
// output is in stdout
console.log(stdout);
//If stdout has 1 it satisfies else false
});
Run Code Online (Sandbox Code Playgroud)
这是一个黑客,并不是这个问题的好答案.有没有办法验证nodejs中的密码而不使用这样的解决方法?
我知道PHP 5.5是alpha版本,但我正在制作的这个类只是通过使用function_exists()来提前使用它的散列特性.
我查看了password_hash文档.第三个参数是$ options,它目前支持两个选项,'salt'和'cost'.
它陈述如下:
cost,表示应该使用的算法成本.可以在crypt()页面上找到这些值的示例.
当我进入crypt()页面时,它提供的文档是:
Blowfish使用盐进行散列如下:"$ 2a $","$ 2x $"或"$ 2y $",两位数的成本参数"$"和字母表中的22位数字"./0-9A-Za -z".在salt中使用此范围之外的字符将导致crypt()返回零长度字符串.两位数的成本参数是底层基于Blowfish的散列算法的迭代计数的基数2对数,并且必须在04-31范围内,超出此范围的值将导致crypt()失败.5.3.7之前的PHP版本仅支持"$ 2a $"作为salt前缀:PHP 5.3.7引入了新的前缀来修复Blowfish实现中的安全漏洞.有关安全修复程序的完整详细信息,请参阅»此文档,但总而言之,仅针对PHP 5.3.7及更高版本的开发人员应使用"$ 2y $"优先于"$ 2a $".
我似乎无法把头包裹起来.它说PHP 5.3.7及更高版本应该使用$ 2y $,但是我用什么成本来获得那个并且它是最好的选择值?他们提供的示例使用的值为7,但根据上述情况,它可以达到31,使用说4与31相比有什么不同?
PASSWORD_DEFAULT和PASSWORD_BCRYPT有什么区别?他们都使用Blowfish加密算法吗?算法的成本是多少?如何在PHP中设置password_hash产生255哈希长度而不是60?
我正在尝试在验证库中实现Argon2算法.我希望能够为用户提供一些有用的提示来设置参数.
虽然我理解memory_cost和threads参数如何影响算法,但我似乎无法绕过time_cost参数.
time_cost(整数) - 计算Argon2哈希值所需的最长时间.默认为PASSWORD_ARGON2_DEFAULT_TIME_COST.
讯问1 -默认值为2.它似乎代表一个时间,遗憾的是,单位似乎缺失.是几秒钟?毫秒?
这个SO答案说默认是2 秒.
在第3.1章输入中,这里没有提到时间,只有大量的迭代.
迭代次数
t(用于独立于内存大小调整运行时间)可以是1到2 ^ 32-1之间的任何整数;
与时间相关的值在第9章推荐参数中定义,它说:
计算出
x每个呼叫可以承受的最长时间(以秒为单位)[...]
使用不同的传递次数运行类型
y,内存m和h通道以及线程的方案t.计算最大t运行时间不超过的最大值x.如果超过x甚至t = 1,减少m相应.使用刚确定的值,和
m,哈希所有密码.ht
讯问2 -这是否意味着PHP暴露了时间量x并确定了正确的迭代量t?
定义算法执行时间和迭代次数的时间成本
[...]
时间成本表示将运行哈希算法的次数. …
根据手册:password_hash可以使用此功能(PHP 5 >= 5.5.0)
在寻找替代方法后,我从这里找到了这个简单的功能:http://www.sitepoint.com/password-hashing-in-php/
function generateHash($password) {
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
$salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
return crypt($password, $salt);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在使用function_exists前管理我的代码,但我的问题是关于上面的替代代码,如果它的安全与否,或者在旧版本的PHP中有没有其他选择?
我正在创建一个登录系统,我想对密码进行散列以使它们更安全,但每次都返回一个不同的散列,甚至无法使用password_verify()进行验证,这是我的代码:
$password = password_hash($password4, PASSWORD_DEFAULT);
Run Code Online (Sandbox Code Playgroud)
这是我的验证代码:
if(password_verify($password4, $dbpassword))
Run Code Online (Sandbox Code Playgroud)