单向散列加密
单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出.这个散列计算是单向的,即不能对固定长度的输出进行计算从而获取输入信息.
特征:雪崩效应、定长输出和不可逆
作用:确保数据的完整性
MD5:以 32 字符十六进制数字形式返回散列值。(如果第二个参数为true,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。***由于此函数依赖的算法已不足够复杂,不推荐使用此函数对明文密码加密。详细内容参见附录2。)
crypt:单向字符串散列。(如果第二个参数没有,创建出的会是弱密码,php5.6之后没有会抛出E_NOTICE 级别的错误。为了更好的安全性,请确保指定一个足够强度的盐值。) 附录1
sha1:以 32 字符十六进制数字形式返回散列值。(如果第二个参数为true,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。***由于此函数依赖的算法已不足够复杂,不推荐使用此函数对明文密码加密。详细内容参见附录2。)
对称加密
对称加密是指加密和解密使用的密钥是同一个或者可以互相推算.
urlencode:编码 URL 字符串(除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+))
urldecode :解码已编码的 URL 字符串
base64_encode:使用 MIME base64 对数据进行编码(成功返回编码后的字符串数据, 或者在失败时返回 FALSE)
base64_decode :对使用 MIME base64 编码的数据进行解码(成功返回编码后的字符串数据, 或者在失败时返回 FALSE)
非对称加密
非对称加密是指加密和解密使用的密钥不是同一个.附录3
-------------------------------------------------------------------------------------------------------------------
附录1
在 crypt() 函数支持多重散列的系统上,下面的常量根据相应的类型是否可用被设置为 0 或 1:
- 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() 失败。 PHP 5.3.7 之前只支持 “$2a$” 作为盐值的前缀,PHP 5.3.7 开始引入了新的前缀来修正一个在Blowfish实现上的安全风险。可以参考» this document来了解关于这个修复的更多信息。总而言之,开发者如果仅针对 PHP 5.3.7及之后版本进行开发,那应该使用 “$2y$” 而非 “$2a$”
- 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 将会被转换为最接近的值。
附录2
<?php //用户注册时提交的密码 $pass_user_commit = '123456'; //对用户提交的密码进行password_hash加密,并存储到数据库 $option = array('cost'=>10);//一个包含有选项的关联数组。目前支持两个选项:salt,在散列密码时加的盐(干扰字符串),以及cost,用来指明算法递归的层数。这两个值的例子可在 crypt()找到 $pass = password_hash($pass_user_commit,PASSWORD_BCRYPT,$option); echo $pass; //第一次输出生成的密码:$2y$10$s78CmhptXOj1oYygCAQPNed.lMFqPBAQpJJXek5nf01pMc46gMLCu //第二次输出生成的密码:$2y$10$LoXFBGwuLbAs9CvZ/4usT.jLVgKpUnTBCDRODRJXsC3BkTi3Ci.bC //由此可见,由password_hash函数生成的密码是动态的,破解几乎很难 //用户登录时提交的密码 $pass_user = '123456'; //将用户登录时提交的密码与用户注册时提交的密码进行对比 $re = password_verify($pass_user,$pass); if ($re){ echo "密码正确"; }else { echo "密码错误"; }
附录3
公钥,就是给大家用的,你可以通过电子邮件发布,可以通过网站让别人下载,公钥其实是用来加密/验章用的。私钥,就是自己的,必须非常小心保存,最好加上 密码,私钥是用来解密/签章,首先就Key的所有权来说,私钥只有个人拥有。公钥与私钥的作用是:用公钥加密的内容只能用私钥解密,用私钥加密的内容只能 用公钥解密。
比如说,我要给你发送一个加密的邮件。首先,我必须拥有你的公钥,你也必须拥有我的公钥。
首先,我用你的公钥给这个邮件加密,这样就保证这个邮件不被别人看到,而且保证这个邮件在传送过程中没有被修改。你收到邮件后,用你的私钥就可以解密,就能看到内容。
其次我用我的私钥给这个邮件加密,发送到你手里后,你可以用我的公钥解密。因为私钥只有我手里有,这样就保证了这个邮件是我发送的。
//生成秘钥 不够8位补全 超过后截取 function keydata($key){ if(strlen($key)<8){ return str_pad($key,8,'0',STR_PAD_LEFT); }else{ return substr($key,0,7); } } /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function encrypt($string,$key) { $ivArray=array(0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF); $iv=null; foreach ($ivArray as $element) $iv.=CHR($element); $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC ); $string = $this->pkcs5Pad ( $string, $size ); $data = mcrypt_encrypt(MCRYPT_DES, $this->keydata($key), $string, MCRYPT_MODE_CBC, $iv); $data = base64_encode($data); return $data; } /* *功能:对字符串进行解密处理 *参数一:需要解密的密文 *参数二:密钥 */ function decrypt($string,$key) { $ivArray=array(0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF); $iv=null; foreach ($ivArray as $element) $iv.=CHR($element); $string = base64_decode($string); //echo("****"); //echo($string); //echo("****"); $result = mcrypt_decrypt(MCRYPT_DES, $this->keydata($key), $string, MCRYPT_MODE_CBC, $iv); $result = $this->pkcs5Unpad( $result ); return $result; } function pkcs5Pad($text, $blocksize) { $pad = $blocksize - (strlen ( $text ) % $blocksize); return $text . str_repeat ( chr ( $pad ), $pad ); } function pkcs5Unpad($text) { $pad = ord ( $text {strlen ( $text ) - 1} ); if ($pad > strlen ( $text )) return false; if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad) return false; return substr ( $text, 0, - 1 * $pad ); }
来源:https://www.cnblogs.com/yhq-qhh/p/9606554.html