PHP加密与编码技术
md5加密:
string md5( string $str [,bool $raw output=false])
md5加密方法用的挺多,有两个参数,第一个参数是要加密的字符串,第二个参数默认为false,如果设为true,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。
使用的示例如下:
<?php $str="searchingbeyond";
echo md5($str)."<hr>";//2ce99dc76db0515ac9ea72231b6c57ea
echo md5($str,true);//,��m�QZ��r#lW� ?>
现在md5已经有很多常用的字符串的加密密文,都可以在网上查询到明文,所以单独使用md5加密字符串是不安全的,常见的做法是:(1)在加密前,将明文先加上一个字符串或者其他处理之后再加密,避免直接加密。(2)两次md5加密:直接使用md5加密字符串,然后再将所得的密文进行一次md5加密。
比如下面的例子:
<?php $str="searchingbeyond";
echo md5($str."test")."<hr>";//1e41a5c6ef30cfce94206b51c9b125ef
echo md5(md5($str));//ed67b046e6cf3a0263493f123235f3ce ?>
Crypt加密:单向字符串散列(单向加密,没有解密)
string crypt ( string $str
[, string $salt
] )
函数需要两个参数,第一个参数就是要加密的字符串,第二个参数是干扰参数,如果指定salt,则对于同一字符串的加密结果都相同;如果不指定salt,如果没有提供salt,PHP 将自动生成一个 2 个字符(DES)或者 12 个字符(MD5)的salt。
crypt可以采用多种方法加密,常见的是DES加密和MD5加密。
CRYPT_STD_DES
- 基于标准 DES 算法的散列使用 "./0-9A-Za-z" 字符中的两个字符作为盐值。如果自己指定salt的话,加密时会取前两个字符作为密文的前两位,即使指定的salt多于2个字符,也只取两位。CRYPT_MD5
- MD5 散列使用一个以 $1$ 开始的 12 字符的字符串盐值。
使用例子如下:
<?php $str="searchingbeyond"; //使用DES加密 //只是用两个字符 echo crypt($str,"te")."<hr>";//teiLin.tOOl0I //使用多个字符的结果和使用两个字符的结果是一样的 echo crypt($str,"test")."<hr>";//teiLin.tOOl0I //使用md5方式 //除去$1$$这几个字符,中间最多只有8个字符 echo crypt($str,'$1$hello$')."<hr>";//$1$hello$1FQ6x38RJnfcNH.axVRwW0 //多余8个时只取前8个字符,然后才进行加密 echo crypt($str,'$1$helloworld$')."<hr>";//$1$hellowor$wp9KvKXSOdiLgN6PtkOff/ ?>
sha1加密,和md5加密类似
string sha1 ( string $str
[, bool $raw_output
= false ] )
可传入两个参数,第一个参数是加密的字符串,第二个参数如果被设置为 TRUE
,那么 sha1 摘要将以 20 字符长度的原始格式返回,否则返回值是一个 40 字符长度的十六进制数字(比md5长一点)。
使用例子如下:
<?php $str="searchingbeyond"; echo sha1($str)."<hr>";//d6151e17fbf5379371af17cd4224217be6fd1388 echo sha1($str,true)."<hr>";//���7�q��B$!{��� ?>
以上的三种加密方法都是单向的,但是可以通过一些碰撞,暴力破解,所以可以采取一些额外的操作,比如像类似两次md5等方法。
下面两种方法称为编码技术,存在编码,就存在解码。
URL编码技术
string urlencode(string $str)
传入一个字符串,返回编码(此处是编码,不是加密)字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。
对应的URL解码:
string urlencode(string $str)
还有另外两个函数:
string rawurlencode ( string $str
)
string rawurldecode ( string $str
)
使用示例如下:
<?php $str="https://www.cnblogs.com/-beyond?type = php"; //编码 $str1=urlencode($str)."<hr>"; echo $str1;//https%3A%2F%2Fwww.cnblogs.com%2F-beyond%3Ftype+%3D+php //解码 echo urldecode($str1); //https://www.cnblogs.com/-beyond?type = php ?>
Base64编码技术
string base64_encode ( string $data
)
string base64_decode ( string $data
[, bool $strict
= false ] )
使用 base64 对 data
进行编码。设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。
常用于将文件,如图片,视频进行编码成ASCII码。
使用示例:
<?php $str="寻觅 beyond"; //编码 echo base64_encode($str)."<hr>";//5a+76KeFIGJleW9uZA== //解码 echo base64_decode(base64_encode($str));//寻觅 beyond ?>
效率:
统计了很多次,同一个字符串,加密或编码花费的时间从高到低排序如下:
crypt > urlencode > md5 > sha1 > base64_encode