设为首页 收藏本站
查看: 831|回复: 0

[经验分享] php写一个md5/sha1+salt密码类

[复制链接]
发表于 2017-4-9 11:30:37 | 显示全部楼层 |阅读模式
最近暴露出的明文密码事件,自己以前一直是使用md5直接保存,了解一下暴力破解md5也是很容易攻破,google了一下大家推荐md5/sha1+salt的方式,在保证性能的情况下,安全性也提高了。今晚没事自己写了一个简单的处理类。
<?php
/**
* cypt & check password
* author: zweiwei
* email: lnnujxxy@gmail.com
* date: 2012/01/30
*/
class Security {
private static $defaultSalt = '}#f4ga~g%7hjg4&j(7mk?/!bj30ab-wi=6^7-$^R9F|GK5J#E6WT;IO[JN';
public static function cryptPassword($password, $uid=null) {
self::isVaildPassword($password);
$salt = self::generateSalt($uid);
return md5(sha1($salt.$password));
}
public static function checkPassword($cryptPassword, $password, $uid=null) {
if(strlen($cryptPassword) !== 32) {
throw new Exception("cryptPassword :".$cryptPassword." length is wrong!");
}
self::isVaildPassword($password);
$salt = self::generateSalt($uid);
if(md5(sha1($salt.$password)) === $cryptPassword) {
return true;
}
return false;
}
private static function generateSalt($uid=null) {
$md5Str = is_null($uid) ? md5($uid) : md5(self::$defaultSalt);
return substr($md5Str, 8, 16);
}
private static function isVaildPassword($password) {
if(!$password || strlen($password) < 8) {
throw new Exception("password :".$password." must be longer than 8");
}
// contain ~!@#$%^&*
if(!preg_match('/[~!@#$%^&]/', $password)) {
throw new Exception("password :".$password." must contain special characters(~!@#$%^&)");
}
}
}

测试代码:
require_once 'PHPUnit/Autoload.php';
class SecurityTest extends PHPUnit_Framework_TestCase {
public function testCryptPassword()
{
$cryptPassword = Security::cryptPassword('12345686000&$~', 123);
$this->assertEquals(32, strlen($cryptPassword));
$cryptPassword = Security::cryptPassword('12345686000&$~');
$this->assertEquals(32, strlen($cryptPassword));
}
public function testCheckPassword()
{
$this->assertTrue(Security::checkPassword(Security::cryptPassword('12345686000&$~', 123), '12345686000&$~', 123));
$this->assertFalse(Security::checkPassword(Security::cryptPassword('12345686000&$~', 123), '12345686000&$', 123));
}
}

参考:
http://jinchishuxue.iteye.com/blog/1126271
http://woshixushigang.iteye.com/blog/1181423

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362363-1-1.html 上篇帖子: 新工作机会,asp.net php java dba等等 下篇帖子: isolated 十个超级有用的PHP代码片段
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表