您的位置 首页 php

php用户密码你会怎么存?

数据加密

如果你是一个软件工程师,也可以叫做码农,对数据加密应该很熟悉,加密学是一门很悠久,也很复杂的一门学问。

最常见的是用户密码的加密。相信大家都听到过很多大网站数据泄露的新闻 ,后果是很严重的,所以数据加密的重要性不言而喻,

数据加密的方式有很多种,我们今天只聊一下用户密码的加密方式。不管是不是技术原因,用户密码都不能明文存储,不要觉得不可能,很多用户密码真的是明文。

php密码 加密算法

1. md5 ,虽然md5是一个单向加密算法,但是现在已经不够安全,建议不要直接使用了。使用强大的 彩虹表 很容易 暴力破解的。

2.md5 + salt ,增加一个随机的 字符串 ,使用类似md5(md5($pwd).$salt)这样的加密处理,salt越长,破解的难度越大,安全性比较高,但是需要给每个用户单独存储一个salt。

3. PHP 用户密码加密函数password_hash

自PHP5.5.0之后,新增加了密码 散列算法 函数(password_ hash ),password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)。 password_hash() 兼容 crypt()。 所以, crypt() 创建的密码散列也可用于 password_hash()。

password_hash不需要再单独存储盐值,而且每次加密的值都不一样,我们只需要存储加密字符串,验证时用password_verify()方法即可得出结果!

当前支持的 算法

PASSWORD_DEFAULT – 使用 bcrypt 算法 (PHP 5.5.0 默认)。 注意,该常量会随着 PHP 加入更新更高强度的算法而改变。 所以,使用此常量生成结果的长度将在未来有变化。 因此,数据库里储存结果的列可超过60个字符(最好是255个字符)。

PASSWORD_BCRYPT – 使用 CRYPT_BLOWFISH 算法创建散列。 这会产生兼容使用 “$2y$” 的 crypt()。 结果将会是 60 个字符的字符串, 或者在失败时返回 FALSE

PASSWORD_ARGON2I – 使用 Argon2 散列算法创建散列。

返回值:

返回散列后的密码, 或者在失败时返回 FALSE。

使用的算法、cost 和盐值作为散列的一部分返回。所以验证散列值的所有信息都已经包含在内。 这使 password_verify() 函数验证的时候,不需要额外储存盐值或者算法的信息。

加密代码:

<?php

/**

* 我们想要使用默认算法散列密码

* 当前是 BCRYPT,并会产生 60 个字符的结果。

*

* 请注意,随时间推移,默认算法可能会有变化,

* 所以需要储存的空间能够超过 60 字(255字不错)

*/

echo password_hash(“123456”, PASSWORD_DEFAULT);

?>

输出类似结果:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

或者使用下面的方法:

<?php

public function _get_password($pwd){

$options = [

‘cost’ => 12 // level 越大,强度越大,根据自己的硬件调整,最小为10

];

//return password_hash($pwd, PASSWORD_DEFAULT);

return password_hash($pwd, PASSWORD_BCRYPT, $options);

}

?>

验证:

<?php

$inputValue = ‘123456’; //用户输入的密码

var_dump(password_verify( $inputValue, ‘存储的加密字符串’));

?>

如果匹配成功输出true ,否则为false:

后记:如果你有更好的加密方法,欢迎留言讨论。

如果你是一个软件工程师,也可以叫做码农,对数据加密应该很熟悉,加密学是一门很悠久,也很复杂的一门学问。

最常见的是用户密码的加密。相信大家都听到过很多大网站数据泄露的新闻 ,后果是很严重的,所以数据加密的重要性不言而喻,

数据加密的方式有很多种,我们今天只聊一下用户密码的加密方式。不管是不是技术原因,用户密码都不能明文存储,不要觉得不可能,很多用户密码真的是明文。

php密码加密算法:

1. md5 ,虽然md5是一个单向加密算法,但是现在已经不够安全,建议不要直接使用了。使用强大的彩虹表很容易 暴力破解的。

2.md5 + salt ,增加一个随机的字符串,使用类似md5(md5($pwd).$salt)这样的加密处理,salt越长,破解的难度越大,安全性比较高,但是需要给每个用户单独存储一个salt。

3. PHP 用户密码加密函数password_hash

自PHP5.5.0之后,新增加了密码散列算法函数(password_hash),password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)。 password_hash() 兼容 crypt()。 所以, crypt() 创建的密码散列也可用于 password_hash()。

password_hash不需要再单独存储盐值,而且每次加密的值都不一样,我们只需要存储加密字符串,验证时用password_verify()方法即可得出结果!

当前支持的算法:

PASSWORD_DEFAULT – 使用 bcrypt 算法 (PHP 5.5.0 默认)。 注意,该常量会随着 PHP 加入更新更高强度的算法而改变。 所以,使用此常量生成结果的长度将在未来有变化。 因此,数据库里储存结果的列可超过60个字符(最好是255个字符)。

PASSWORD_BCRYPT – 使用 CRYPT_BLOWFISH 算法创建散列。 这会产生兼容使用 “$2y$” 的 crypt()。 结果将会是 60 个字符的字符串, 或者在失败时返回 FALSE。

PASSWORD_ARGON2I – 使用 Argon2 散列算法创建散列。

返回值:

返回散列后的密码, 或者在失败时返回 FALSE。

使用的算法、cost 和盐值作为散列的一部分返回。所以验证散列值的所有信息都已经包含在内。 这使 password_verify() 函数验证的时候,不需要额外储存盐值或者算法的信息。

加密代码:

<?php

/**

* 我们想要使用默认算法散列密码

* 当前是 BCRYPT,并会产生 60 个字符的结果。

*

* 请注意,随时间推移,默认算法可能会有变化,

* 所以需要储存的空间能够超过 60 字(255字不错)

*/

echo password_hash(“123456”, PASSWORD_DEFAULT);

?>

输出类似结果:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

或者使用下面的方法:

<?php

public function _get_password($pwd){

$options = [

‘cost’ => 12 //level越大,强度越大,根据自己的硬件调整,最小为10

];

//return password_hash($pwd, PASSWORD_DEFAULT);

return password_hash($pwd, PASSWORD_BCRYPT, $options);

}

?>

验证:

<?php

$inputValue = ‘123456’; //用户输入的密码

var_dump(password_verify( $inputValue, ‘存储的加密字符串’));

?>

如果匹配成功输出true ,否则为false:

后记:如果你有更好的加密方法,欢迎留言讨论。

文章来源:智云一二三科技

文章标题:php用户密码你会怎么存?

文章地址:https://www.zhihuclub.com/152225.shtml

关于作者: 智云科技

热门文章

网站地图