一、加密算法
单项散列加密
将任意长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,即不能对固定长度的输出信息进行计算从而得到输入信息。
- 特征:雪崩效应、定长输出和不可逆。
- 作用:确保数据的完整性。
- 加密算法:md5(标准密钥长度128位)、sha1(标准密钥长度160位)、md4、CRC-32。
对称散列加密
对称加密是指加密和解密是使用同一个密钥,或者可以互相推算。
- 加密方和解密方使用同一个密钥。
- 加密解密的速度比较快,适合数据比较长时的使用。
- 密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦。
- 加密算法:DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard,支持128、192、256、512位密钥的加密)、Blowfish。
非对称散列加密
非对称加密和解密使用的不是同一个密钥,其中一个对外公开,称作公钥,另一个只有所属者知道,称作私钥。
- 每个用户拥用一对密钥加密:公钥和私钥。
- 公钥加密,私钥解密;私钥加密,公钥解密。
- 公钥传输的过程不安全,易被窃取和替换。
- 由于公钥使用的密钥长度非常长,所以公钥加密速度非常慢,一般不使用其去加密
- 某一个用户用其私钥加密,其他用户用其公钥解密,实现数字签名的作用。
- 公钥加密的另一个作用是实现密钥交换。
- 加密和签名算法:RSA、ELGamal。
- 公钥签名算法:DSA。
二、PHP常用算法
MD5加密
string md5 ( string $str [, bool $raw_output = false ] )
- md5()默认情况下以 32 字符十六进制数字形式返回散列值,它接受两个参数,第一个为要加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,md5()则会返回原始的 16 位二进制格式报文摘要。
- md5()为单向加密,没有逆向解密算法,但是还是可以对一些常见的字符串通过收集,枚举,碰撞等方法破解。
Sha1加密
string sha1 ( string $str [, bool $raw_output = false ])
- 跟md5很像,不同的是sha1()默认情况下返回40个字符的散列值,传入参数性质一样,第一个为加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,sha1()则会返回原始的20 位原始格式报文摘要。
- sha1()也是单行加密,没有逆向解密算法。
Urlencode加密
string urlencode ( string $str )
- 一个参数,传入要加密的字符串(通常应用于对URL的加密)
- urlencode为双向加密,可以用urldecode来加密(严格意义上来说,不算真正的加密)。
- 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。
- 常见的urlencode()的转换字符:
? => %3F
= => %3D
% => %25
& => %26
\ => %5C
空格 => %5C
base64编码加密
string base64_decode ( string $encoded_data )
- base64_encode()接受一个参数,也就是要编码的数据(这里不说字符串,是因为很多时候base64用来编码图片)。
- base64_encode()为双向加密,可用base64_decode()来解密。
Crypt加密
string crypt ( string $str [, string $salt ] )
- crypt()接受两个参数,第一个为需要加密的字符串,第二个为盐值(就是加密干扰值,如果没有提供,则默认由PHP自动生成)。
- crypt()为单向加密,跟md5一样。
password_hash
string password_hash ( string $password , int $algo [, array $options ] )
- password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)。 password_hash() 兼容 crypt()。 所以, crypt() 创建的密码散列也可用于 password_hash()。
- password_hash()创建的hash可以用password_verift()验证。