在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://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