用passwordphp hash解密.php加密 怎么解密

PHP中的密码加密的解决方案总结
转载 & & 作者:chenpingzhao
很多用户多个网站使用一个密码,当一个密码丢失其他也遭殃,本篇文章介绍了PHP中的密码加密的解决方案总结,有需要的朋友可以了解一下。
层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯在不同网站使用相同的密码,一家“暴库”,全部遭殃
一般的解决方案。
1、将明文密码做单向hash
$password = md5($_POST["password"]);
2、密码+salt后做单向hash,PHP内置了hash()函数,你只需要将加密方式传给hash()函数就好了。你可以直接指明sha256, sha512, md5, sha1等加密方式
function generateHashWithSalt($password) {
$intermediateSalt = md5(uniqid(rand(), true));
$salt = substr($intermediateSalt, 0, 6);
return hash("sha256", $password . $salt);
单向哈希算法有一个特性,无法通过哈希后的摘要(digest)恢复原始数据,常用的单向哈希算法包括SHA-256,SHA-1,MD5等。例如,对密码“passwordhunter”进 行SHA-256哈希后的摘要(digest)如下:
“bbed833d2c9b140bec7eefa9e0bb95c2d44c”
注意:攻击者可以将所有密码的常见组合进行单向哈希,得到一个摘要组合,然后与数据库中的摘要进行比对即可获得对应的密码。这个摘要组合也被称为rainbow table。更糟糕的是,一个攻击者只要建立上述的rainbow table,可以匹配所有的密码数据库。仍然等同于一家“暴库”,全部遭殃
比较好的解决方案
function generateHash($password) {
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
$salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
return crypt($password, $salt);
Bcrypt 其实就是Blowfish和crypt()函数的结合,我们这里通过CRYPT_BLOWFISH判断Blowfish是否可用,然后像上面一样生成一个盐值,不过这里需要注意的是,crypt()的盐值必须以2a2a或者2y2y开头,详细资料可以参考下面的链接:
Password Hashing API
Password Hashing API是PHP 5.5之后才有的新特性,它主要是提供下面几个函数供我们使用
password_hash() – 对密码加密.
password_verify() – 验证已经加密的密码,检验其hash字串是否一致.
password_needs_rehash() – 给密码重新加密.
password_get_info() – 返回加密算法的名称和一些相关信息.
虽然说crypt()函数在使用上已足够,但是password_hash()不仅可以使我们的代码更加简短,而且还在安全方面给了我们更好的保障,所以,现在PHP的官方都是推荐这种方式来加密用户的密码,很多流行的框架比如Laravel就是用的这种加密方式
$hash = password_hash($passwod, PASSWORD_DEFAULT);?&
PASSWORD_DEFAULT目前使用的就是Bcrypt,最好的还是Password Hashing API。这里需要注意的是,如果你代码使用的都是PASSWORD_DEFAULT加密方式,那么在数据库的表中,password字段就得设置超过60个字符长度,你也可以使用PASSWORD_BCRYPT,这个时候,加密后字串总是60个字符长度。
这里使用password_hash()你完全可以不提供盐值(salt)和 消耗值 (cost),你可以将后者理解为一种性能的消耗值,cost越大,加密算法越复杂,消耗的内存也就越大。当然,如果你需要指定对应的盐值和消耗值,你可以这样写
function custom_function_for_salt(){
return $salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
$password =123456;
$options = [
'salt' =& custom_function_for_salt(), //write your own code to generate a suitable salt
'cost' =& 12 // the default cost is 10
$hash = password_hash($password, PASSWORD_DEFAULT, $options);
密码加密过后,我们需要对密码进行验证,以此来判断用户输入的密码是否正确
if (password_verify($password, $hash)) {
// Invalid
直接使用password_verify就可以对我们之前加密过的字符串(存在数据库中)进行验证了
如果有时候我们需要更改我们的加密方式,如某一天我们突然想更换一下盐值或者提高一下消耗值,我们这时候就要使用到password_needs_rehash()函数了
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' =& 12])) {
// cost change to 12
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' =& 12]);
// don't forget to store the new hash!
只有这样,PHP的Password Hashing API才会知道我们重现更换了加密方式,这样的主要目的就是为了后面的密码验证,password_get_info(),这个函数一般可以看到下面三个信息
algo – 算法实例
algoName – 算法名字
options – 加密时候的可选参数
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具最佳实践系列(六):PHP 开发者如何做好密码保护 & Laravel 底层密码存储和验证实现
这篇文章对我很有帮助
这篇文章对我很有帮助
学院君 has written
终身学习者,Laravel学院院长在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
标签:至少1个,最多5个
你还在用md5+salt方式加密密码吗?PHP5.5引入了Password Hashing函数,内核自带无需安装扩展。在PHP5.4下测试了下也可是可以的,使用前最好确认一下你当前的环境是否支持这些函数。
Password Hashing主要提供了4个函数
//查看哈希值的相关信息
array password_get_info (string $hash)
//创建hash密码
string password_hash(string $password , integer $algo [, array $options ])
//判断hash密码是否特定选项、算法所创建
boolean password_needs_rehash (string $hash , integer $algo [, array $options ]
boolean password_verify (string $password , string $hash)
//验证密码
$password = 'password123456';//原始密码
$hash_password = password_hash($password, PASSWORD_BCRYPT);//使用BCRYPT算法加密密码
if (password_verify($password , $hash_password)){
echo "密码匹配";
echo "密码错误";
通过password_hash加密后的密码,使用字典方式很难破解,因为每次生成的密码都是不一样的,破解这种加密只能采用暴力破解。加密方法再好,原始密码设置的过于简单都容易被破解,设置复杂的密码才是王道。
1 收藏&&|&&22
你可能感兴趣的文章
131 收藏,13.8k
10 收藏,819
1 收藏,480
这个没法存数据库吧,因为每次密码被password_hash后都不一样的
这个没法存数据库吧,因为每次密码被password_hash后都不一样的
可以存,只要每次都调用password_verify函数验证密码即可。正如你所说,每次密码被password_hash后都不一样,所以如果拿当前hash后的值与数据库的值做比对,是验证不了的。
可以存,只要每次都调用password_verify函数验证密码即可。
正如你所说,每次密码被password_hash后都不一样,所以如果拿当前hash后的值与数据库的值做比对,是验证不了的。
@Zeta考拉 好的
谢谢 明白了
@Zeta考拉 好的
谢谢 明白了
5.2没法用了
5.2没法用了
第一次了解到这类函数,受教了
第一次了解到这类函数,受教了
5.5以后才支持吧
5.5以后才支持吧
假如我当前使用的算法($algo)以后修改了,那么我当前存在数据库里的hash密码(password_hash的返回值)不就会验证(password_verify)错误吗?
假如我当前使用的算法($algo)以后修改了,那么我当前存在数据库里的hash密码(password_hash的返回值)不就会验证(password_verify)错误吗?
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。&这篇文章主要介绍了PHP的password_hash()使用实例,需要的朋友可以参考下一、前言PHP5.5提供了许多新特性及Api函数,其中之一就是Password Hashing API(创建和校验哈希密码)。它包含4个函数:password_get_info()、password_hash()、password_needs_rehash()、password_verify()。在PHP5.5之前,我们对于密码的加密可能更多的是采用md5或sha1之类的加密方式(没人像CSDN那样存明文吧。。),如:echo md5(&123456&); //输出: e10adc3949ba59abbe56e057f20f883e但是简单的md5加密很容易通过字典的方式进行破解,随便找个md5解密的网站就能获取原始密码。二、Password Hashing APIphp5.5提供的Password Hashing API就能很好的解决这些问题。我们先来看password_hash()函数:&代码如下:string password_hash ( string $password , integer $algo [, array $options ])它有三个参数:密码、哈希算法、选项。前两项为必须的。让我们使用password_hash()简单的创建一个哈希密码:复制代码 代码如下:$pwd = &123456&;$hash = password_hash($pwd, PASSWORD_DEFAULT);echo $上例输出结果类似:$2y$10$4kAu4FNGuolmRmSSHgKEMe3DbG5pm3diikFkiAKNh.Sf1tPbB4uo2并且刷新页面该哈希值也会不断的变化。哈希值创建完毕,我们可以用password_verify()来校验密码是否和哈希值匹配:复制代码 代码如下:boolean password_verify ( string $password , string $hash )&它接收2个参数:密码和哈希值,并返回布尔值。检查之前生成的哈希值是否和密码匹配:&&代码如下:if (password_verify($pwd,'$2y$10$4kAu4FNGuolmRmSSHgKEMe3DbG5pm3diikFkiAKNh.Sf1tPbB4uo2')) { &&& & echo &密码正确&;} else { && & echo &密码错误&;}&&&基本上使用以上这2个函数就能安全的创建和校验hash密码了,还有另外2个API函数:&&代码如下:password_get_info() & & & & & & &//查看哈希值的相关信息password_needs_rehash() & & //检查一个hash值是否是使用特定算法及选项创建的三、点评虽然通过password_hash()创建的哈希密码更加安全,但是却降低了互操作性。如我们使用md5方式,在php中用标准的MD5加密,很容易通过其他语言来校验,如node.js:复制代码 代码如下:var hash = crypto.createHash('md5').update(&123456&).digest('hex');if(hash == &e10adc3949ba59abbe56e057f20f883e&) &console.log('密码正确');而使用password_hash()加密的哈希值基本只能通过PHP的password_verify来校验。这2种方法各有优劣,是使用md5(或sha1等)+salt(干扰字符串)的方式还是使用password_hash()大家根据具体情况取舍把。
欢迎转载:
推荐:    

我要回帖

更多关于 sp password加密解密 的文章

 

随机推荐