md5加密算法在PHP中是最常见的加密算法,这个算法是不可逆的,通常用于加密用户的密码等信息来保证用户的信息安全。MD5 报文摘要算法:MD5 报文摘要算法将任意长度的信息作为输入值,并将其换算成一个 128 位长度的"指纹信息"或"报文摘要"值来代表这个输入值,并以换算后的值作为结果。MD5 算法主要是为数字签名应用程序而设计的;在这个数字签名应用程序中,较大的文件将在加密(这里的加密过程是通过在一个密码系统下[如:RSA]的公开密钥下设置私有密钥而完成的)之前以一种安全的方式进行压缩。举个例子
<?php
//这里是一个字符串
$str = "this is string";
//通过MD5加密函数加密
$res = md5($str);
//在PHP中,MD5()函数还有第二个参数,为bool类型,当为TRUE是返回的加密是16字符原始
//二进制格式字符串,当为FALSE是返回32位的16进制,默认为false,一般都默认
//返回二进制
$res = md5($str,true);
?>
crypt()加密算法是一种不可逆的加密算法,他有两个参数,一个是需要加密的字符串,另外一个是盐值(或者成为干扰字符串),如果没有指定第二个参数那么将自己随机生成一个干扰字符串并且是以MD5加密的方式。另外这个函数在不同的操作系统上的表现形式也是不一样的,会自动检测。举个例子。
<?php
//需要加密的字符串
$str = "this is string";
//使用crypt加密,不指定盐值
$res = crypt($str);
//指定盐值,但是盐值只能写两位,如果超过了则只会取前两位,在某些系统中会直接返回FALSE
$res = crypt($str,'jm');
?>
sha1加密算法和MD5加密算法一样时不可逆的,有两个参数,一个是要加密的字符串,第二个是bool值,如果指定第二个参数为TRUE,则返回二进制格式的字符串,如果不指定则默认为FALSE,返回的是40位的16进制格式的字符串,举个例子
<?php
//需要加密的字符串
$str = "this is string";
//通过sha1进行加密
$res = sha1($str);
//通过指定第二个参数加密
$res = sha1($str,true);
?>
对于我们的网站,直接暴露给用户的就是地址栏的传参,对于这一部分都是明文的,所以我们可以使用基本的加密算法来简单加密一下,注意,此种方式加密是可逆的,也就是说加密后的密文我们可以解密之后看到,所以如果你想实现真正的加密,并不推荐这个加密算法。
http://www.xxxx.com?name=xxxx&amp;phone=112
//需要加密的网址
$str = "http://www.xxxx.com?name=xxxx&phone=112";
//使用urlencode加密
$res = urlencode($str);
//使用urldecode解密
$result = urldecode($res);
既然通过这种方式加密解密并且加密之后也并没有什么太大的区别,我们需要他的目的是什么呢?我们想对于想破解这串加密的字符串可以轻松的破解,其实这两个函数有他特殊的作用,也就是说除了加密的作用,当然了这是题外话,因为本主题主要是加密,但是作为扩展还是要说一下。
<?php
//为了解决这个问题我们就可以对这部分字符编码
$str = "http://xxxx.com?name=".urlencode('xxxx&123');
//这样我们传过来的值就变成了name = xxxx&123
?>
大家注意,虽然base64写到本节加密算法中,但是他并不是主要用来加密的,而且从大多数的程序来说,几乎没有人会用他作为加密手段来加密数据,那么他的作用主要是用于做什么呢?这要说的base64加密的机制了。
base64加密本质上说就是把数据转换为ASCLL码,比如一个图片进行base64编码就会变成一堆以Ascll码连接的字符串,这会更有利于文件的传输,当然base64的作用在与文件的传输。例如手机客户端上传文件到服务器,使用base64编码可以轻松实现文件的传输。
base64_encode($data);
base64_decode($data);
hash加密也是不可逆的,因为是给定一个不确定的字符串返回特定长度的字符串,这个本质意义上来说实现了单项散列加密。使用方法
hash($ago,$data);
Password Hashing API是PHP 5.5之后才有的新特性,它主要是提供下面几个函数供我们使用:
password_hash() – 对密码加密.
password_verify() – 验证已经加密的密码,检验其hash字串是否一致.
password_needs_rehash() – 给密码重新加密.
password_get_info() – 返回加密算法的名称和一些相关信息.
虽然说crypt()函数在使用上已足够,但是password_hash()不仅可以使我们的代码更加简短,而且还在安全方面给了我们更好的保障,所以,现在PHP的官方都是推荐这种方式来加密用户的密码,很多流行的框架比如Laravel就是用的这种加密方式。
hash = password_hash($passwod, PASSWORD_DEFAULT);
对,就是这么简单,一行代码,All done。
PASSWORD_DEFAULT目前使用的就是Bcrypt,所以在上面我会说推荐这个,不过因为Password Hashing API做得更好了,我必须郑重地想你推荐Password Hashing API。这里需要注意的是,如果你代码使用的都是PASSWORD_DEFAULT加密方式,那么在数据库的表中,password字段就得设置超过60个字符长度,你也可以使用PASSWORD_BCRYPT,这个时候,加密后字串总是60个字符长度。
这里使用password_hash()你完全可以不提供盐值(salt)和 消耗值 (cost),你可以将后者理解为一种性能的消耗值,cost越大,加密算法越复杂,消耗的内存也就越大。当然,如果你需要指定对应的盐值和消耗值,你可以这样写:
$options = [
'salt' => custom_function_for_salt(), //write your own code to generate a suitable salt
'cost' => 12 // the default cost is 10 ];
$hash = password_hash($password, PASSWORD_DEFAULT, $options);
if (password_verify($password, $hash)) {
// Pass
}else {
// Invalid
}
很简单的吧,直接使用password_verify就可以对我们之前加密过的字符串(存在数据库中)进行验证了。
然而,如果有时候我们需要更改我们的加密方式,如某一天我们突然想更换一下盐值或者提高一下消耗值,我们这时候就要使用到password_needs_rehash()函数了:
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) {
// cost change to 12 $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// don't forget to store the new hash!
}
只有这样,PHP的Password Hashing API才会知道我们重现更换了加密方式,这样的主要目的就是为了后面的密码验证。
看完本文有收获?点赞、分享是最大的支持!