单向散列加密
单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出.这个散列计算是单向的,即不能对固定长度的输出进行计算从而获取输入信息.
特征:雪崩效应、定长输出和不可逆
作用:确保数据的完整性
 
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
  1. <?php
  2.  
  3. //用户注册时提交的密码
  4. $pass_user_commit = '123456';
  5. //对用户提交的密码进行password_hash加密,并存储到数据库
  6. $option = array('cost'=>10);//一个包含有选项的关联数组。目前支持两个选项:salt,在散列密码时加的盐(干扰字符串),以及cost,用来指明算法递归的层数。这两个值的例子可在 crypt()找到
  7. $pass = password_hash($pass_user_commit,PASSWORD_BCRYPT,$option);
  8. echo $pass;
  9. //第一次输出生成的密码:$2y$10$s78CmhptXOj1oYygCAQPNed.lMFqPBAQpJJXek5nf01pMc46gMLCu
  10. //第二次输出生成的密码:$2y$10$LoXFBGwuLbAs9CvZ/4usT.jLVgKpUnTBCDRODRJXsC3BkTi3Ci.bC
  11. //由此可见,由password_hash函数生成的密码是动态的,破解几乎很难
  12.  
  13. //用户登录时提交的密码
  14. $pass_user = '123456';
  15. //将用户登录时提交的密码与用户注册时提交的密码进行对比
  16. $re = password_verify($pass_user,$pass);
  17. if ($re){
  18. echo "密码正确";
  19. }else {
  20. echo "密码错误";
  21. }
 
附录3
公钥,就是给大家用的,你可以通过电子邮件发布,可以通过网站让别人下载,公钥其实是用来加密/验章用的。私钥,就是自己的,必须非常小心保存,最好加上 密码,私钥是用来解密/签章,首先就Key的所有权来说,私钥只有个人拥有。公钥与私钥的作用是:用公钥加密的内容只能用私钥解密,用私钥加密的内容只能 用公钥解密。
比如说,我要给你发送一个加密的邮件。首先,我必须拥有你的公钥,你也必须拥有我的公钥。
首先,我用你的公钥给这个邮件加密,这样就保证这个邮件不被别人看到,而且保证这个邮件在传送过程中没有被修改。你收到邮件后,用你的私钥就可以解密,就能看到内容。
其次我用我的私钥给这个邮件加密,发送到你手里后,你可以用我的公钥解密。因为私钥只有我手里有,这样就保证了这个邮件是我发送的。
  1. //生成秘钥 不够8位补全 超过后截取
  2. function keydata($key){
  3.  
  4. if(strlen($key)<8){
  5. return str_pad($key,8,'0',STR_PAD_LEFT);
  6. }else{
  7. return substr($key,0,7);
  8. }
  9. }
  10. /*
  11. *功能:对字符串进行加密处理
  12. *参数一:需要加密的内容
  13. *参数二:密钥
  14. */
  15. function encrypt($string,$key) {
  16.  
  17. $ivArray=array(0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF);
  18. $iv=null;
  19. foreach ($ivArray as $element)
  20. $iv.=CHR($element);
  21.  
  22. $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
  23. $string = $this->pkcs5Pad ( $string, $size );
  24.  
  25. $data = mcrypt_encrypt(MCRYPT_DES, $this->keydata($key), $string, MCRYPT_MODE_CBC, $iv);
  26.  
  27. $data = base64_encode($data);
  28. return $data;
  29. }
  30. /*
  31. *功能:对字符串进行解密处理
  32. *参数一:需要解密的密文
  33. *参数二:密钥
  34. */
  35. function decrypt($string,$key) {
  36.  
  37. $ivArray=array(0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF);
  38. $iv=null;
  39. foreach ($ivArray as $element)
  40. $iv.=CHR($element);
  41.  
  42. $string = base64_decode($string);
  43. //echo("****");
  44. //echo($string);
  45. //echo("****");
  46. $result = mcrypt_decrypt(MCRYPT_DES, $this->keydata($key), $string, MCRYPT_MODE_CBC, $iv);
  47. $result = $this->pkcs5Unpad( $result );
  48.  
  49. return $result;
  50. }
  51.  
  52. function pkcs5Pad($text, $blocksize)
  53. {
  54. $pad = $blocksize - (strlen ( $text ) % $blocksize);
  55. return $text . str_repeat ( chr ( $pad ), $pad );
  56. }
  57.  
  58. function pkcs5Unpad($text)
  59. {
  60. $pad = ord ( $text {strlen ( $text ) - 1} );
  61. if ($pad > strlen ( $text ))
  62. return false;
  63. if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
  64. return false;
  65. return substr ( $text, 0, - 1 * $pad );
  66. }

PHP加密函数的更多相关文章

  1. (转)笔记320 SQLSERVER中的加密函数 2013-7-11

    1 --SQLSERVER中的加密函数 2013-7-11 2 ENCRYPTBYASYMKEY() --非对称密钥 3 ENCRYPTBYCERT() --证书加密 4 ENCRYPTBYKEY() ...

  2. PHP的几个常用加密函数

    在php的开发过程中,常常需要对部分数据(如用户密码)进行加密 一.加密类型: 1.单向散列加密 就是把任意长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,即不能对固定长度的输出 ...

  3. PHP的几个常用加密函数(转载 https://jellybool.com/post/php-encrypt-functions)

    PHP的几个常用加密函数 在网站的开发过程中,常常需要对部分数据(如用户密码)进行加密,本文主要介绍PHP的几个常见的加密函数 MD5加密: string md5 ( string $str [, b ...

  4. (转载)MS SQL Server 未公开的加密函数有哪些?

    MS SQL Server 未公开的加密函数有哪些? 以下的文章是对MS SQL Server 未公开的加密函数的具体操作,如果你对其相关的实际操作有兴趣的话,你就可以点击了. MS SQL Serv ...

  5. ThinkPHP第二十五天(自动完成、用户名密码PHP正则、移位或加密函数)

    1.ThinkPHP自动完成功能 跟昨天的自动验证功能类似,也是需要在自定义的UserModel类,进行使用. 使用方法:定义$_auto属性 $_auto = array( array(完成字段,完 ...

  6. PHP的几个常用加密函数【转载】

    转自 https://jellybool.com/post/php-encrypt-functions 在网站的开发过程中,常常需要对部分数据(如用户密码)进行加密,本文主要介绍PHP的几个常见的加密 ...

  7. 网上搜集的一段php可逆加密函数

    php加密函数: function my_encrypt($data, $key='unun.in') { $char = $str = ''; $key = md5($key); $x = 0; $ ...

  8. 一个简洁的PHP可逆加密函数(分享)

    http://www.jb51.net/article/38018.htm 本篇文章是对一个简洁的PHP可逆加密函数进行了详细的分析介绍,需要的朋友参考下   很多时候我们需要对数据进行加密解密,比如 ...

  9. 常用的几个PHP加密函数

    1.前言 PHP加密方式分为单项散列加密,对称加密,非对称加密这几类. 像常用的MD5.hash.crypt.sha1这种就是单项散列加密,单项散列加密是不可逆的. 像URL编码.base64编码这种 ...

  10. php提供的用户密码加密函数

    在实际项目中,对用户的密码加密基本上采用的  md5加盐的方式, php5.5后提供了一个加密函数,不需要手动加盐,不需要去维护盐值, $str = "123456"; $pwd ...

随机推荐

  1. maven项目更新之后,JDK版本成为1.5

    描述:maven项目更新之后,JDK版本成为1.5? 解决:在pom.xml文件中配置java版本,选中build path 设置之后,刷新maven项目

  2. AndroidO Treble架构下Hal进程启动及HIDL服务注册过程【转】

    本文转载自:https://blog.csdn.net/yangwen123/article/details/79854267 通过前面对Treble架构的介绍,我们知道,Android Framew ...

  3. C#开发者工具网

    使用key值[123456]对[50cms]进行对称加密-在线DES对称加密/解密- 开发者工具网  http://tool.sufeinet.com/Encrypt/DesEncrypt.aspx? ...

  4. 浅尝flutter中的http请求

    import 'package:flutter/material.dart'; class News extends StatefulWidget { final String title,imgli ...

  5. JS控制显示/隐藏二级菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. P3261 [JLOI2015]城池攻占

    思路 左偏树维护每个骑士的战斗力和加入的深度(因为只能向上跳) 注意做乘法的时候加法tag会受到影响 代码 #include <cstdio> #include <algorithm ...

  7. ETCD应用

    etcd:从应用场景到实现原理的全方位解读 ETCD:A highly-available key value store for shared configuration and service d ...

  8. python学习 day013打卡 内置函数

    本节主要内容: 内置函数: 内置函数就是python给你提供的.拿来直接用的函数,比如print,input等等.截止到python版本3.6.2 python一共提供了68个内置函数.他们就是pyt ...

  9. MInio python

    # Install Minio library. # $ pip install minio # # Import Minio library. from minio import Minio # I ...

  10. HTML基本内容

    设置背景色:<body bgcolor="#AAAAAA">,设置背景图:<body background="1.png">. 颜色的知 ...