PHP加密方式分为单项散列加密,非对称加密这几类
温馨提示:这篇文章已超过557天没有更新,请注意相关的内容是否还可用!
PHP加密方法分为单项散列加密,对称加密,非对称加密这几类。像常见的MD5、hash、crypt、sha1这种就是单项散列加密,单项散列加密是不可逆的。像URL编码、编码这些就是对称加密php在线加密源码,是可逆的,就是说加密解密都是用的同一秘钥。除之外就是非对称加密,加密和解读的秘钥不是同一个,如果从安全性而言,加密的信息一旦还想着再解读出来,非对称加密无疑是最为安全的手段。
MD5加密
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()加密算法
crypt()加密算法是一种不可逆的加密算法,他有两个参数,一个是必须加密的字符串,另外一个是盐值(以及作为干扰字符串),如果没有指定第二个参数那么将自己随机生成一个干扰字符串以及是以MD5加密的方法。另外这个函数在不同的操作平台上的体现方式也有不一样的,会自动测试。举个实例。
php
//需要加密的字符串
$str = "this is string";
//使用crypt加密,不指定盐值
$res = crypt($str);
//指定盐值,但是盐值只能写两位,如果超过了则只会取前两位,在某些系统中会直接返回FALSE
$res = crypt($str,'jm');
?>
sha1加密算法
sha1加密算法和MD5加密算法一样时不可逆的,有两个参数,一个是要加密的字符串,第二个是bool值,如果选定第二个参数为TRUE,则返回二字节格式的数组串,如果不选定则默认为FALSE,返回的是40位的16字节格式的数组串,举个实例
php
//需要加密的字符串
$str = "this is string";
//通过sha1进行加密
$res = sha1($str);
//通过指定第二个参数加密
$res = sha1($str,true);
?>
URL编码加密
针对我们的网站,直接暴露给客户的就是地址栏的传参,对于这一个别都是明文的,所以我们可以使用基本的加密算法来简单加密一下,注意,此种方法加密是可逆的,也就是说加密后的密文我们可以解读之后发现,所以即使你想谋求真正的加密,并不推荐这个加密算法。
在PHP中针对URL加密解密用到两个函数和.
http://www.xxxx.com?name=xxxx&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
?>
编码加密
大家注意,虽然提到本节加密算法中,但是他并不是主要拿来加密的,而且从大多数的程序来说,几乎没有人会用他成为加密方式来加密数据,那么他的作用主要是用于做哪些呢?这要说的加密的模式了。
加密本质上说就是把数据转换为ASCLL码,比如一个照片进行编码经常成为一堆以Ascll码连接的字符串,这会更有促使文件的传输,当然的作用在与文件的存储。例如电脑用户端上传文件到服务器,使用编码可以轻松实现文件的传输。
加密函数
base64_encode($data);
解密函数
base64_decode($data);
hash加密
hash加密也是不可逆的,因为是给定一个不确认的数组串返回特定长度的数组串,这个本质含义上来说推动了单项散列加密。使用方式
hash($ago,$data);
API加密
API是PHP5.5随后才有的新特征,它主要是提供以下几个函数供我们使用:
password_hash() – 对密码加密.
password_verify() – 验证已经加密的密码,检验其hash字串是否一致.
password_needs_rehash() – 给密码重新加密.
password_get_info() – 返回加密算法的名称和一些相关信息.
尽管说crypt()函数在使用上已足够,但是()虽然可以使我们的代码变得简短,而且还在安全方面给了我们更好的保障,所以,现在PHP的官方都是推荐这些方法来加密客户的密码,很多流行的框架包括就是用的这些加密方法。
hash = password_hash($passwod, PASSWORD_DEFAULT);
对,就是这样简单,一行代码,Alldone。
现在使用的就是,所以在里面我会说推荐这个,不过由于API做得更好了,我应该郑重地想你推荐API。这里必须留意的是,如果你代码使用的都是加密方法,那么在数据库的表中,字段就得修改达到60个字符宽度,你也可以使用,这个之后,加密后字串总是60个字节长度。
此处使用()你完全可以不提供盐值(salt)和消耗值(cost)php在线加密源码,你可以将前者理解为一种性能的损耗值,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
}
很简单的吧,直接使用就可以对我们之前加密过的字符串(存在数据库中)进行验证了。
虽然,如果有之后我们必须修改我们的加密方法,如某一夜我们时常想替换一下盐值以及提高一下消耗值,我们这之后还要使用到h()函数了:
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的API才能了解我们重回更换了加密方法,这样的主要目的就是为了上面的密码验证。
看完本文有收获?点赞、分享是最大的支持!
本文来自网络,如有侵权请联系网站客服进行删除
还没有评论,来说两句吧...