PHP中常见的几种加密算法
侧边栏壁纸
  • 累计撰写 88 篇文章
  • 累计收到 673 条评论
  • 今日更新 0 篇文章

PHP中常见的几种加密算法

七年
2021-07-18 / 0 评论 / 47 阅读 / 正在检测是否收录...

前言

PHP加密方式分为单项散列加密,对称加密,非对称加密这几类。像常用的MD5、hash、crypt、sha1这种即是单项散列加密,单项散列加密是不行逆的。像URL编码、base64编码这种即是对称加密,是可逆的,即是说加密解密都是用的同一秘钥。除此外即是非对称加密,加密息争密的秘钥不是同一个,若从安全性而言,加密的信息若还想着再解密回归,非对称加密无疑是非常为安全的方式。
Test

MD5加密算法

md5加密算法在PHP中是非常多见的加密算法,这个算法是不行逆的,平时用于加密用户的密码等信息来包管用户的信息安全。来自 RFC 1321 的注释 - MD5 报文摘要算法:MD5 报文摘要算法将任意长度的信息作为输入值,并将其换算成一个 128 位长度的"指纹信息"或"报文摘要"值来代表这个输入值,并以换算后的值作为结果。MD5 算法主要是为数字署名软件程序而设计的;在这个数字署名软件程序中,较大的文件将在加密(这里的加密过程是通过在一个密码体系下[如:RSA]的公示密钥下配置私有密钥而实现的)之前以一种安全的方式举行压缩。好,来举个例子

<?php 
 
//这里是一个字符串 $str = "this is zifuchuan"; 
 
//通过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加密解密用到两个函数urlencode和urldecode

http://qin0.cn?name=qin0&;123

我们便对这个地址进行加密

<?php
//需要加密的网址
$str = "http://xnsay.com?name=xnsay&amp;123";
 
//使用urlencode加密
$res = urlencode($str);
 
//使用urldecode解密
$result = urldecode($res);
 
?>

既然通过这种方式加密解密并且加密以后也并无什么太大的区别,我们需要他的目的是甚么呢?我们想对于想破解这串加密的字符串可以轻松的破解,实在这两个函数有他特殊的好处,也就是说除了加密的好处,固然了这是题外话,由于本主题要紧是加密,不过作为扩大或是要说一下。

<?php
//在HTML传参到后台中的时候如果我们想把&作为参数传到后台,在没有加密之前,浏览器会把他作为 //参数分隔符 //例如:http://xnsay.com?name=xnsay&;123,我们想把xnsay&123作为参数传给 //后台,这个时候直接这样写后台得到的数据却只得到name的值为xnsay,而123确作为变量 //当然了用一个数字做变量是不合法的,但是浏览器确并不这么智能的区分他 //为了解决这个问题我们就可以对这部分字符编码 $str = "http://xnsay.com?name=".urlencode('xnsay&123'); //这样我们传过来的值就变成了name = xnsay&123 ?>

Base64编码加密

大家注意,固然base64写到本节加密算法中,但是他并不是主要用来加密的,并且从大多数的程序来说,几乎没有人会用他作为加密手法来加密数据,辣么他的好处主要是用于做甚么呢?这要说的base64加密的机制了。base64加密本质上说即是把数据转换为ASCLL码,比如一个图片举行base64编码就会变成一堆以Ascll码持续的字符串,这会更有益于文件的传输,固然base64的好处在与文件的传输。例如手机客户端上传文件到服务器,应用base64编码可以轻松完成文件的传输。
base64加密函数

base64_encode($data);

base64解密函数

base64_decode($data);

hash加密
hash加密也是不行逆的,因为是给定一个不确定的字符串回笼特定长度的字符串,这个本质作用上来说实现了单项散列加密。应用技巧

hash($ago,$data);


虽然说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才会晓得我们重现更换了加密方式,这样的要紧目的即是为了背面的密码考证。
简单地说一下password_get_info(),这个函数普通可以看到底下三个消息:

algo – 算法实例
algoName – 算法名字
options – 加密时候的可选参数
-1

七年博客 - 你的专属归

https://www.qin0.cn/
更多精彩文章,按Ctrl+D收藏本站!

评论 (0)

取消
在线人数:1人