`

php写一个md5/sha1+salt密码类

    博客分类:
  • PHP
阅读更多
最近暴露出的明文密码事件,自己以前一直是使用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
分享到:
评论

相关推荐

    javascript/jquery 的md5加密插件

    在本场景中,我们有一个名为"jquery_md5"的压缩包,里面包含了一个适用于JavaScript和jQuery环境的MD5加密插件。 这个插件使得在前端开发中实现数据的MD5加密变得更加便捷。JavaScript本身并不内置MD5功能,因此...

    哈客部落MD5加密解密API接口.rar

    2. **MD5验证**:检查一个给定的MD5摘要是否与某个数据匹配,用于验证数据的完整性。 3. **盐值MD5**:可能包含盐值(salt)的概念,增加加密的复杂性,使得破解更为困难。 4. **批量处理**:可能支持一次处理多个...

    MD5加密调用 数据库存加密数据

    因此,在现代密码学实践中,通常会结合盐值(salt)进行加盐MD5加密,或者使用更安全的哈希算法如SHA-256。 在工具方面,有很多编程语言提供了MD5加密的库或内置函数,如Python的`hashlib`模块,Java的`java....

    基于PHP的下支持1632位MD5加解密API接口.zip

    在压缩包内的文件"132699488261243844"可能是一个PHP源代码文件,包含了实现MD5加解密功能的类或者函数。通常,这样的代码会包括一个或多个函数,如`encryptMD5()`和`decryptMD5()`,它们可能使用了一些特定的算法...

    PHP实现的简单sha1加密功能示例

    实际上,SHA1和MD5在现代密码学标准下都被认为不够安全,因为它们可能遭受碰撞攻击。对于安全性要求较高的应用,应该考虑使用如SHA-256或更强的哈希函数,或者结合密钥派生函数和加盐(salt)机制。 此外,代码中...

    net-asp-php-sha256.zip

    由于SHA256的计算复杂性,它在安全性方面优于早期的MD5和SHA1算法,但随着计算能力的提升,对于特定攻击,如碰撞攻击,其安全性也面临挑战,因此出现了更强的SHA3系列算法。 综上所述,"net-asp-php-sha256.zip"这...

    功能强大的php加密解密类.zip

    这个PHP加密解密类可能还提供了哈希函数,如MD5、SHA-1和更安全的SHA-256等。哈希函数将任意长度的数据转换为固定长度的唯一表示,常用于密码存储。虽然哈希函数不可逆,但它们不是绝对安全的,因为可能存在哈希碰撞...

    php100 2012版 17集CodeIgniter框架教程(3)密码

    - **密码加密算法介绍**:包括常用的加密算法如MD5、SHA-1等的基本原理及优缺点分析。 - **CodeIgniter内置加密函数**:详细介绍框架提供的加密方法,如`password_hash()`用于生成密码哈希值等。 - **安全的密码存储...

    QQ账号密码验证PHP

    查询条件是账号等于用户输入的QQ号码,密码经过某种加密算法(如MD5或SHA-1)处理后也与数据库中的值进行比较。 4. **结果处理**:如果账号和密码匹配,验证成功,PHP脚本可以返回一个表示成功的响应,并可能将登录...

    页面密码加密传输代码

    虽然主要应用是服务器端的PHP,但在前端,Spark-MD5可以用于在浏览器端预处理密码,生成一个哈希值,再发送到服务器,增加安全性。 5. **客户端加密**:除了服务器端加密,还可以在客户端进行密码加密。例如,使用...

    PHP中的密码加密的解决方案总结

    层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯...你可以直接指明sha256, sha512, md5, sha1等加密方式 &lt;?php function generateHashWithSalt($password) { $intermediateSalt = md5(uniqid(rand

    深入密码加salt原理的分析

    当使用散列算法处理密码时,如MD5、SHA等,相同的明文密码总是产生相同的散列值。这就意味着,攻击者可以使用散列值字典(例如彩虹表)来猜测和破解用户密码。一旦攻击者获得了密码散列值,就能够使用这些预先计算好...

    php结合md5实现的加密解密方法

    MD5全称为Message-Digest Algorithm 5,是一种广泛使用的密码散列函数,能够产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。通常用于验证数据的完整性和一致性,而非真正的加密,因为...

    MD5_Algorithm_php_js:md5算法javascript a php mvc

    PHP的`md5()`函数还可以接受一个可选参数,用于决定是否返回二进制格式的哈希值。 在JavaScript中,虽然没有内置的MD5函数,但可以通过第三方库如`crypto-js`或`js-md5`来实现。以`crypto-js`为例: ```javascript...

    php实现MD5加密16位(不要默认的32位)

    MD5加密的一个关键特性是其不可逆性,即从散列值无法轻易还原原始数据,这使得MD5常用于存储密码的安全处理。然而,需要注意的是,MD5的碰撞问题(两个不同的输入可能会产生相同的散列值)意味着它不适合用于安全性...

    PHP_JiaMI.rar_php 加密_php加密

    `md5()`和`sha1()`是两种常用的哈希函数,用于计算字符串的固定长度的哈希值,但它们不适用于加密,因为存在碰撞风险。`password_hash()`是用于存储和验证用户密码的安全方法,它结合了bcrypt算法和随机盐。`openssl...

    PHP实现的单向散列加密操作示例

    // 或者可以使用 $sha1=md5($str.$salt); // 使用MD5散列函数 echo $str; echo " "; echo $sha1; echo " "; echo "http://localhost//sha1_de.php?str=$str&sha1=$sha1"; ?&gt; ``` 在这个示例中,我们首先定义了...

    PHP常见加密函数用法示例【crypt与md5】

    - **MD5加密**:`md5($str)` 返回的是一个32位的十六进制字符串,这个散列值是固定的,对于相同的输入会产生相同的输出,但无法从散列值还原原始信息。 在线加密解密工具可以帮助开发者测试这些加密函数,例如AES...

    详解PHP处理密码的几种方式

    在密码加密中,盐值(Salt)是一个增强安全性的关键概念。盐值是一个随机字符串,附加到原始密码上,增加攻击者破解密码的难度。以下是如何在PHP中使用盐值的例子: ```php function generateHashWithSalt($...

    PHP网站安全及加密技术对策.pdf

    在这里需要注重分析Mhash扩展库常量,确保Mhash扩展库能够支持多种散列算法,例如MD5,CRC32,SHA1等等散列算法,并对函数算法输出内容进行分析,明确算法名称。例如,要分析Mhash扩展库的实际应用内容,获取文件的...

Global site tag (gtag.js) - Google Analytics