最近暴露出的明文密码事件,自己以前一直是使用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
分享到:
相关推荐
win10 计算文件的MD5/SHA1/SHA256等校验值的工具 win10 计算文件的MD5/SHA1/SHA256等校验值的工具 非常方便
微软原版,无毒保证,给需要的人,不要分哦。
通过命令行方式生成或校验文件的md5或sha1。部分网友反应windows 7下不可用。通过命令行方式生成或校验文件的md5或sha1。部分网友反应windows 7下不可用。通过命令行方式生成或校验文件的md5或sha1。部分网友反应...
Hash算法校验工具MD5/SHA1/CRC
Windows MD5/SHA1 Hash 命令行工具
本资源包含一套成型的dll库,只需拷贝里面的include/lib/...里面涵盖常用的数据加密算法(RSA/DES),数据签名(MD5/CRC32/SHA1),源代码暂不开放(主要对网上的代码,做得二次封装,爬坑及优化,哈哈哈哈……)
MD5/SHA1/BASE64加密解密js文件,包含使用方法。
MD5/SHA1/BASE64加密程序,以及Base64解密程序。
作用: 对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。 从查表法可以看出,即便是将原始密码加密后的哈希值存储在数据库中依然是不够安全的。那么有什么好的办法来解决这个问题呢?答案是加盐。 Salt是...
MD5和SHA1校验码验证器 用于验证软件的MD5和SHA1值是否正确。
平时用的md5+sha1加密的js文件,用法: <script type="text/javascript" src="js/md5.js"></script> <script type="text/javascript" src="js/sha1.js"></script> var hash = hex_md5(name+" "+password); var ...
文件MD5 / SHA1 /CRC32验证工具 md5.exe MD5: 22A8DB0286D4C49BDEBF67D8ABF6099E SHA1: 4BBCB3130C303CBAD4D65C4D7C9A201271E40A8C CRC32: 1A1E5308
基于C语言实现json+base64+hmac sha1+md5, 与Crypto-JS库运行结果比对一致(这个很重要,很...编译命令#gcc cjson/cJSON.c cjson/cJSON_Utils.c hmac_sha1/hmac_sha1.c hmac_sha1/sha1.c md5/md5.c test.c -o test -lm
MD5/SHA1/SHA256 纯C语言源码.支持增量计算. 包括测试程序与官方文档. 该代码我已按纯C语言基于接口编程方式封装,可以直接调用.有问题请联系我.
无意弄到的资源,文件的205页开始有DES/IDEA/AES/MD5/SHA-1算法的中间过程数据输出, 希望对大家有帮助
Hash V1.04 MD5 SHA1 CRC32 值的校验工具,将目标文件拖到窗口内即可。绿色、小巧、实用。个人觉得最好用的校验工具。
获取文件md5和sha1摘要值的工具,通过cmd命令操作获取,可以用来校验文件是否发生改变。
MD5/SHA-1摘要生成算法,在Visual Studio 2008中调试通过。只是个示例,相互学习
md5介绍:md5deep工具就是监控linux系统下的文件,给文件生成md5值,这个包是他的源码
base64/md5/RSA/SHA1等加密算法Java实现,附jar包,供学习参考使用