最近暴露出的明文密码事件,自己以前一直是使用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
分享到:
相关推荐
在本场景中,我们有一个名为"jquery_md5"的压缩包,里面包含了一个适用于JavaScript和jQuery环境的MD5加密插件。 这个插件使得在前端开发中实现数据的MD5加密变得更加便捷。JavaScript本身并不内置MD5功能,因此...
2. **MD5验证**:检查一个给定的MD5摘要是否与某个数据匹配,用于验证数据的完整性。 3. **盐值MD5**:可能包含盐值(salt)的概念,增加加密的复杂性,使得破解更为困难。 4. **批量处理**:可能支持一次处理多个...
因此,在现代密码学实践中,通常会结合盐值(salt)进行加盐MD5加密,或者使用更安全的哈希算法如SHA-256。 在工具方面,有很多编程语言提供了MD5加密的库或内置函数,如Python的`hashlib`模块,Java的`java....
在压缩包内的文件"132699488261243844"可能是一个PHP源代码文件,包含了实现MD5加解密功能的类或者函数。通常,这样的代码会包括一个或多个函数,如`encryptMD5()`和`decryptMD5()`,它们可能使用了一些特定的算法...
实际上,SHA1和MD5在现代密码学标准下都被认为不够安全,因为它们可能遭受碰撞攻击。对于安全性要求较高的应用,应该考虑使用如SHA-256或更强的哈希函数,或者结合密钥派生函数和加盐(salt)机制。 此外,代码中...
由于SHA256的计算复杂性,它在安全性方面优于早期的MD5和SHA1算法,但随着计算能力的提升,对于特定攻击,如碰撞攻击,其安全性也面临挑战,因此出现了更强的SHA3系列算法。 综上所述,"net-asp-php-sha256.zip"这...
这个PHP加密解密类可能还提供了哈希函数,如MD5、SHA-1和更安全的SHA-256等。哈希函数将任意长度的数据转换为固定长度的唯一表示,常用于密码存储。虽然哈希函数不可逆,但它们不是绝对安全的,因为可能存在哈希碰撞...
- **密码加密算法介绍**:包括常用的加密算法如MD5、SHA-1等的基本原理及优缺点分析。 - **CodeIgniter内置加密函数**:详细介绍框架提供的加密方法,如`password_hash()`用于生成密码哈希值等。 - **安全的密码存储...
查询条件是账号等于用户输入的QQ号码,密码经过某种加密算法(如MD5或SHA-1)处理后也与数据库中的值进行比较。 4. **结果处理**:如果账号和密码匹配,验证成功,PHP脚本可以返回一个表示成功的响应,并可能将登录...
虽然主要应用是服务器端的PHP,但在前端,Spark-MD5可以用于在浏览器端预处理密码,生成一个哈希值,再发送到服务器,增加安全性。 5. **客户端加密**:除了服务器端加密,还可以在客户端进行密码加密。例如,使用...
层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯...你可以直接指明sha256, sha512, md5, sha1等加密方式 <?php function generateHashWithSalt($password) { $intermediateSalt = md5(uniqid(rand
当使用散列算法处理密码时,如MD5、SHA等,相同的明文密码总是产生相同的散列值。这就意味着,攻击者可以使用散列值字典(例如彩虹表)来猜测和破解用户密码。一旦攻击者获得了密码散列值,就能够使用这些预先计算好...
MD5全称为Message-Digest Algorithm 5,是一种广泛使用的密码散列函数,能够产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。通常用于验证数据的完整性和一致性,而非真正的加密,因为...
PHP的`md5()`函数还可以接受一个可选参数,用于决定是否返回二进制格式的哈希值。 在JavaScript中,虽然没有内置的MD5函数,但可以通过第三方库如`crypto-js`或`js-md5`来实现。以`crypto-js`为例: ```javascript...
MD5加密的一个关键特性是其不可逆性,即从散列值无法轻易还原原始数据,这使得MD5常用于存储密码的安全处理。然而,需要注意的是,MD5的碰撞问题(两个不同的输入可能会产生相同的散列值)意味着它不适合用于安全性...
`md5()`和`sha1()`是两种常用的哈希函数,用于计算字符串的固定长度的哈希值,但它们不适用于加密,因为存在碰撞风险。`password_hash()`是用于存储和验证用户密码的安全方法,它结合了bcrypt算法和随机盐。`openssl...
// 或者可以使用 $sha1=md5($str.$salt); // 使用MD5散列函数 echo $str; echo " "; echo $sha1; echo " "; echo "http://localhost//sha1_de.php?str=$str&sha1=$sha1"; ?> ``` 在这个示例中,我们首先定义了...
- **MD5加密**:`md5($str)` 返回的是一个32位的十六进制字符串,这个散列值是固定的,对于相同的输入会产生相同的输出,但无法从散列值还原原始信息。 在线加密解密工具可以帮助开发者测试这些加密函数,例如AES...
在密码加密中,盐值(Salt)是一个增强安全性的关键概念。盐值是一个随机字符串,附加到原始密码上,增加攻击者破解密码的难度。以下是如何在PHP中使用盐值的例子: ```php function generateHashWithSalt($...
在这里需要注重分析Mhash扩展库常量,确保Mhash扩展库能够支持多种散列算法,例如MD5,CRC32,SHA1等等散列算法,并对函数算法输出内容进行分析,明确算法名称。例如,要分析Mhash扩展库的实际应用内容,获取文件的...