欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

文摘  php加密函数md5,crypt,sha1,base64_encode 等使用介绍

PHP学习 本站 1494 0评论

在php的开发过程中,在做注册、登录或是url 传递参数时都会用到字符变量的加密,下面我们就来简单的介绍下 php 自带的加密函数 


一、加密类型


1.单向散列加密

就是把任意长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,即不能对固定长度的输出信息进行计算从而得到输入信息。

1)特征:雪崩效应、定长输出和不可逆。

2)作用是:确保数据的完整性。

3)加密算法:md5标准密钥长度128位)、sha1标准密钥长度160位)、md4、CRC-32


2.对称散列加密

对称加密是指加密和解密是使用同一个密钥,或者可以互相推算。

1)加密方和解密方使用同一个密钥。

2)加密解密的速度比较快,适合数据比较长时的使用。

3)密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦。

4)加密算法:DESData Encryption Standard)、3DES、AESAdvanced Encryption Standard,支持128、192、256、512位密钥的加密)、Blowfish。


3.非对称散列加密

非对称加密和解密使用的不是同一个密钥,其中一个对外公开,称作公钥,另一个只有所属者知道,称作私钥。

1)每个用户拥用一对密钥加密:公钥和私钥。

2)公钥加密,私钥解密;私钥加密,公钥解密。

3)公钥传输的过程不安全,易被窃取和替换。

4)由于公钥使用的密钥长度非常长,所以公钥加密速度非常慢,一般不使用其去加密。

5)某一个用户用其私钥加密,其他用户用其公钥解密,实现数字签名的作用。

6)公钥加密的另一个作用是实现密钥交换。

7)加密和签名算法:RSA、ELGamal。

8)公钥签名算法:DSA。


注释:

1)RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;

2)DSADigital Signature Algorithm):数字签名算法,是一种标准的 DSS数字签名标准);

3)由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

对称加密算法不能实现签名,因此签名只能非对称算法。

4)由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

5)在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。


二、php中常用的加密函数


php对数据进行加密的主要函数有crypt(), md5()和sha1()常用的3个,另外还有加密扩展库Mcrypt和Mash。下面介绍3种函数加密方法


1.Md5()加密


方式: 单向加密

语法: md5(string $str [, bool $raw_output = false])

· $str:原始字符串

· $raw_output:如果可选的raw_output被设置为true, 那么md5报文摘要将以16字节长度的原始二进制格式返回. 返回以32位字符十六进制数字形式返回散列值

例:

$password = '123456';

echo md5($password);

得到结果是 e10adc3949ba59abbe56e057f20f883e


md5二次加密:md5(md5($string, true))


2.Crypt()加密

 

方式: 单向加密

语法: string crypt(string $str[, string $salt]) , 返回一个基于标准UNIX DES算法或系统上其它可用的替代算法的三列字符串

· $str: 需要加密的明文

· $salt: 加密时的干扰串,是编码更安全

注意: 如果加密时没有加上这个$salt参数, 将随机生成一个干扰串, 否则刷新加密秘文不变

例:

$password = '123456';

$salt = "test";// 只取前两个

echo crypt($password, $salt);

得到的结果是teMGKvBPcptKo


在 crypt() 函数支持多重散列的系统上,下面的常量根据相应的类型是否可用被设置为 0 或 1:

算法常量:

[CRYPT_SALT_LENGTH]--默认的加密长度。使用标准的 DES 加密,长度为 2

[CRYPT_STD_DES]--基于标准 DES 算法的散列使用 "./0-9A-Za-z" 字符中的两个字符作为盐值。在盐值中使用非法的字符将导致 crypt() 失败。

[CRYPT_EXT_DES]--扩展的基于 DES 算法的散列。其盐值为 9 个字符的字符串,由 1 个下划线后面跟着 4 字节循环次数和 4 字节盐值组成。它们被编码成可打印字符,每个字符 6 位,有效位最少的优先。0 到 63 被编码为 "./0-9A-Za-z"。在盐值中使用非法的字符将导致 crypt() 失败。

[CRYPT_MD5]--MD5 散列使用一个以 $1$ 开始的 12 字符的字符串盐值。

[CRYPT_BLOWFISH]--Blowfish 算法使用如下盐值:“$2a$”,一个两位 cost 参数,“$” 以及 64 位由 “./0-9A-Za-z” 中的字符组合而成的字符串。在盐值中使用此范围之外的字符将导致 crypt() 返回一个空字符串。两位 cost 参数是循环次数以 2 为底的对数,它的范围是 04-31,超出这个范围将导致 crypt() 失败。

CRYPT_SHA256--SHA-256算法使用一个以 $5$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。

CRYPT_SHA512--SHA-512算法使用一个以 $6$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。


以不同散列类型使用 crypt()的例子如下:

if (CRYPT_STD_DES == 1) {
    echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";
}
if (CRYPT_EXT_DES == 1) {
    echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n";
}
if (CRYPT_MD5 == 1) {
    echo 'MD5:          ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n";
}
if (CRYPT_BLOWFISH == 1) {
    echo 'Blowfish:     ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA256 == 1) {
    echo 'SHA-256:      ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA512 == 1) {
    echo 'SHA-512:      ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}

其结果如下:

Standard DES: rl.3StKT.4T8M

Extended DES: _J9..rasmBYk8r9AiWNc

MD5:          $1$rasmusle$rISCgZzpwk3UhDidwXvin0

Blowfish:     $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

SHA-256:      $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6

SHA-512:      $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21


3.Sha1()加密


方式: 单向加密

语法: string sha1(string $str [, bool $raw_output=false]) 计算字符串的sha1散列值

· $str: 加密的字符串

· $raw_output: 如果可选的raw_output参数被设置为TRUE, 那么sha1摘要将以20字符长度的原始格式返回, 否则返回值是一个40字符串长度的十六进制数字.

例:

$password = '123456';

echo sha1($password);

得到的结果是7c4a8d09ca3762af61e59520943dc26494f8941b


以上几种虽然是不可逆加密,但是也可以根据查字典的方式去解密。如下的地址中就提供了可以将上面的加密结果解密出来的功能。


4.password_hash()加密


方式: 单向加密

自PHP5.5.0之后,新增加了密码散列算法函数(password_hash),password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)。 password_hash() 兼容 crypt()。 所以, crypt() 创建的密码散列也可用于 password_hash()。

password_hash不需要再单独存储盐值,而且每次加密的值都不一样,我们只需要存储加密字符串,验证时用password_verify()方法即可得出结果!

password_hash ( string $password , int $algo [, array $options ] ) : string


当前支持的算法:

PASSWORD_DEFAULT - 使用 bcrypt 算法 (PHP 5.5.0 默认)。 注意,该常量会随着 PHP 加入更新更高强度的算法而改变。 所以,使用此常量生成结果的长度将在未来有变化。 因此,数据库里储存结果的列可超过60个字符(最好是255个字符)。

PASSWORD_BCRYPT - 使用 CRYPT_BLOWFISH 算法创建散列。 这会产生兼容使用 "$2y$" 的 crypt()。 结果将会是 60 个字符的字符串, 或者在失败时返回 FALSE。

PASSWORD_ARGON2I - 使用 Argon2 散列算法创建散列。


参数:

· password 用户的密码。

· Caution 使用PASSWORD_BCRYPT 做算法,将使 password 参数最长为72个字符,超过会被截断。

· algo 一个用来在散列密码时指示算法的密码算法常量。

· options 一个包含有选项的关联数组。目前支持两个选项:salt,在散列密码时加的盐(干扰字符串),以及cost,用来指明算法递归的层数。这两个值的例子可在 crypt() 页面找到。

省略后,将使用随机盐值与默认 cost。


返回值:

· 返回散列后的密码, 或者在失败时返回 FALSE。

· 使用的算法、cost 和盐值作为散列的一部分返回。所以验证散列值的所有信息都已经包含在内。 这使 password_verify() 函数验证的时候,不需要额外储存盐值或者算法的信息。


例:

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

输出类似结果:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a


参考官网:密码散列算法函数(http://php.net/manual/zh/ref.password.php  )


除了上面的不可逆加密函数外,还有下面的可逆加密函数


1.Urlencode加密


string urlencode ( string $str )

· 一个参数,传入要加密的字符串(通常应用于对URL的加密)

· urlencode为双向加密,可以用urldecode来加密(严格意义上来说,不算真正的加密)

· 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码不同。


常见的urlencode()的转换字符

? => %3F

= => %3D

% => %25

& => %26

\ => %5C

空格 => %5C


string urldecode ( string $str )

解码给出的已编码字符串中的任何 %##。 加号('+')被解码成一个空格字符。

例:

$url = 'http://www.xxx.com/CraryPrimitiveMan/';
$encodeUrl = urlencode($url);
echo $encodeUrl . "\n";// 如果是在网页上展示的,就将\n修改为<br/>
echo urldecode($encodeUrl);

结果:

http%3A%2F%2Fwww.xxx.com%2FCraryPrimitiveMan%2F

http://www.xxx.com/CraryPrimitiveMan/


基于RFC 3986的加密URL的方法如下:

function myUrlEncode($string) {
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
    return str_replace($entities, $replacements, urlencode($string));
}


2.base64编码加密


string base64_encode( string $data) 

· 将字符串以 MIME BASE64 编码。此编码方式可以让中文字或者图片也能在网络上顺利传输。

· 设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。

· base64_encoded 数据要比原始数据多占用 33% 左右的空间。


string base64_decode ( string $data [, bool $strict = false ] )

对 base64 编码的 data 进行解码。

参数:

data  --  编码过的数据。

strict  --  如果输入的数据超出了 base64 字母表,则返回 FALSE。

例:

$name = 'CraryPrimitiveMan';
$encodeName = base64_encode($name);
echo $encodeName . "\n";
echo base64_decode($encodeName);

结果:

Q3JhcnlQcmltaXRpdmVNYW4=

CraryPrimitiveMan


代码在线加密解密:

http://tool.oschina.net/encrypt    

http://encode.chahuo.com/ 

http://tool.chacuo.net/cryptaes 


三、PHP加密扩展


请参考文章:https://ittxx.cn/view/265 

PHP加密扩展:http://www.php.net/manual/zh/refs.crypto.php 


参考网址:

http://www.php.cn/php/176.html 

https://www.cnblogs.com/kernel123/p/9396759.html 

https://www.cnblogs.com/huyihao/p/6028753.html

http://www.php.cn/php-weizijiaocheng-360354.html


转载请注明: ITTXX.CN--分享互联网 » php加密函数md5,crypt,sha1,base64_encode 等使用介绍

最后更新:2019-02-28 18:08:05

赞 (3) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽