2018-12-05 21:46:06在PHP开发中,你会用哪一种加密的方法?
您现在的位置是: 首页 > php > 在PHP开发中,你会用哪一种加密的方法?
在使用PHP开发Web应用的中,很多的应用都会要求用户注册,而注册的时候就需要我们对用户的信息进行处理了,最常见的莫过于就是邮箱和密码了,本文意在讨论对密码的处理:也就是对密码的加密处理。
相信最开始php开发者接触php的时候,处理密码的首选就是md5了,例如这样:
// md5加密 $str = 123546; $rand = mt_rand(1111,9999); $md51 = md5($str); $md52 = md5(md5($str)); $md53 = '###' . md5(md5($rand . $str)); //print_r($md51); //print_r($md52); //print_r($md53);
然而MD5的加密方式目前在PHP中貌似不太受欢迎了,因为它的加密算法实在是显得有点简单了,而且很多破解密码的站点都存放了很多经过MD5加密的密码字符串,所以这里我是非常不提倡还在单单使用MD5来加密用户的密码的。
php 自带的可逆转的加密为:base64_encode()、urlencode() 相对应的解密函数:base64_decode() 、urldecode() ,如下:
$str = 123456; // base64_encode() 加密 $base64encode=base64_encode($str); echo 'base64_encode加密后的结果为:'.$base64encode.'<br>'; // base64_decode()解密 echo 'base64_decode解密后的结果为:'.base64_decode($base64encode).'<br>'; // urlencode() 加密 $urlencode=urlencode($str); echo 'urlencode加密后的结果为:'.$urlencode.'<br>'; // urldecode() 解密 echo 'urldecode解密后的结果为:'.urldecode($urlencode).'<br>';
在加密的过程,我们还有一个非常常见的小伙伴:盐值。对,我们在加密的时候其实会给加密的字符串添加一个额外的字符串,以达到提高一定安全的目的:
// hash function generateHashWithSalt($password) { $intermediateSalt = md5(uniqid(rand(), true)); $salt = substr($intermediateSalt, 0, 6); return hash("sha256", $password . $salt); }
如果让我来建议一种加密方式的话,Bcrypt可能是我给你推荐的最低要求了,因为我会强烈推荐你后面会说到的Hashing API,不过Bcrypt也不失为一种比较不错的加密方式了。
// Bcrypt Blowfish和crypt()函数的结合 //crypt()的盐值必须以$2a$或者$2y$开头 function generateHash($password) { if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { $salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22); return crypt($password, $salt); } } print_r(generateHash(123456));
这里才是我们的重头戏,Password Hashing API是PHP 5.5之后才有的新特性,它主要是提供下面几个函数供我们使用:
#password_hash() – 对密码加密.
#password_verify() – 验证已经加密的密码,检验其hash字串是否一致.
#password_needs_rehash() – 给密码重新加密.
#password_get_info() – 返回加密算法的名称和一些相关信息.
虽然说crypt()函数在使用上已足够,但是password_hash()不仅可以使我们的代码更加简短,而且还在安全方面给了我们更好的保障,所以,现在PHP的官方都是推荐这种方式来加密用户的密码,很多流行的框架比如Laravel就是用的这种加密方式。
// Password Hashing API $password = 123456; // 加密密码 $hash = password_hash($password, PASSWORD_DEFAULT); //验证密码 if (password_verify($password,$hash)) { echo '密码是正确的'; } else { echo '密码错误的!'; } print_r($hash);
AES加密
之前公司也有用到aes加密。
AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;是一个可逆的加密方式,同md5不同。
AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显,大部分的区别在IV和KEY来计算密文的方法略有区别。
iv的作用?
IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV,既然IV看起来和key一样,却还要多一个IV的目的,对于每个块来说,key是不变的,但是只有第一个块的IV是用户提供的,其他块IV都是自动生成。
IV的长度为16字节。超过或者不足,可能实现的库都会进行补齐或截断。但是由于块的长度是16字节,所以一般可以认为需要的IV是16字节。有想详细了解aes加密的小伙伴,可以网上查阅下,封装好的加密解密类都是有的。
关键字词: php加密方式
下一篇: php 自带过滤和转义函数