php加解密

php加密函数
单向加密: md5 sha1 crypt    

    string md5 ( string $str [, bool $raw_output = false ] )//计算字符串的 MD5 散列值(散列值哈希) ,
        //如需计算文件的 MD5 散列,请使用md5_file(filename) 函数。
         参数: 
        $str:待加密的字符串
        $raw_output:可选参数为true或false,
          两者区别是: true加密后密文为16位二进制格式字符; false加密后密文为32位十六进制格式字符。
          若此处没有参数,则默认为false方式

        echo md5('dgfggh');//ed8ed5baec15fd7d94886c280d81b8c9
        echo md5('dgfggh',true);//
��պ��}��l(���
    string sha1 ( string $str [, bool $raw_output = false ] )
      

      sha1() 函数计算字符串的 SHA-1 散列。sha1() 函数使用美国 Secure Hash 算法 1。

        来自 RFC 3174 的解释 - 美国 Secure Hash 算法 1:SHA-1 产生一个名为报文摘要的 160 位的输出。报文摘要可以被输入到一个可生成或验证报文签名的签名算法。对报文摘要进行签名,而不是对报文进行签名,这样可以提高进程效率,因为报文摘要的大小通常比报文要小很多。数字签名的验证者必须像数字签名的创建者一样,使用相同的散列算法。

        提示:如需计算文件的 SHA-1 散列,请使用 sha1_file() 函数。


      sha的全称是:Secure Hash Algorithm(安全哈希算法)主要适用于数字签名标准 (Digital Signature Standard DSS)里
        面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。
        当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
        PHP提供的sha1()函数使用的就是SHA 算法
      参数说明:
        $str 要计算的字符串
        $raw_output 可选。规定十六进制或二进制输出格式:TRUE - 原始 20 字符二进制格式,FALSE - 默认。40 字符十六进制数
          

          php -r  "echo sha1('未来This is an encoded string');"

            输出:09924078ddba5edd5aaa62314e150d0a4f17e8f9

    string crypt ( string $str [, string $salt ] )//返回一个基于标准 UNIX DES 算法或系统上其他可用的替代算法的散列字符串。
      参数: $str:待加密字符串。
      salt 参数是可选的。然而,如果没有salt的话,crypt()创建出来的会是弱密码。 php 5.6及之后的版本会在没有它的情况下抛出一个 E_NOTICE 级别的错误。为了更好的安全性,请确保指定一个足够强度的盐值。
      password_hash()使用了一个强的哈希算法,来产生足够强的盐值,并且会自动进行合适的轮次。password_hash()crypt()的一个简单封装,并且完全与现有的密码哈希兼容。推荐使用password_hash()
      盐值(就是加密干扰值,如果没有提供,则默认由PHP自动生成);返回散列后的字符串或一个少于 13 字符的字符串,后者为了区别盐值。
      其中使用盐值的意思是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”

        php -r  "echo crypt('未来This is an encoded string');"

          输出:$1$MnEjSof.$9kQRSjCRRplaCvG3X1WVs.

          再次执行输出:  $1$GHVElemo$m/KvHVj3kZ983.0ntfgMW/

        参数不带salt,每次加密得出的密文都不一样。

 

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

      CRYPT_STD_DES - 基于标准 DES 算法的散列使用 "./0-9A-Za-z" 字符中的两个字符作为盐值。

        在盐值中使用非法的字符将导致 crypt() 失败。

        php -r  " if(CRYPT_STD_DES){echo crypt('未来Thisd string','abcdefghi');}"

          输出:abTiXs9UTYYt2,只有前两个字符起作用

      

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

        输出:_abcdefgh3xWhqvEavvc

 

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

<?php
if (CRYPT_MD5 == 1) {
    echo crypt('未来Thisd string', '$1$abcdefghij$');
}
?>

    输出:$1$abcdefgh$0xbuGLUIRXaOn73hOhhlr.

 

 

 

可逆转的加密为:base64_encode()、urlencode()  ,openssl_encrypt

相对应的解密函数:base64_decode() 、urldecode() ,openssl_decrypt

  string base64_encode ( string $data ) //用于加密
  string base64_decode ( string $encoded_data [, bool $strict = false ] ) //用于解密

    解释:base64_encode编码.设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。本函数将字符串以 MIME BASE64 编码。此编码方式可以让中文字或者图片也能在网络上顺利传输。在 BASE64 编码后的字符串只包含英文字母大小写、阿拉伯数字、加号与反斜线,共 64 个基本字符,不包含其它特殊的字符,因而才取名 BASE64。编码后的字符串比原来的字符串长度再加 1/3 左右。

    base64_decode解码. 返回原始数据,失败则返回 FALSE。返回的数据可能是二进制的。

    参数: $encoded_data : 编码过的数据。$strict : 如果输入的数据超出了 base64 字母表,则返回 FALSE.

      php -r  "echo base64_encode('未来This is an encoded string');"

          输出:5pyq5p2lVGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==

  

  string urlencode ( string $str ) //用于加密
  string urldecode ( string $encoded_str ) //用于解密

    urlencode()函数用于将字符串以URL编码,同时它还便于将变量传递给下一页。
    原理是将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
    php -r "echo urlencode('未来This is an encoded string');"

      输出:%E6%9C%AA%E6%9D%A5This+is+an+encoded+string

    

  string openssl_encrypt($data, $method, $password, $options = 0, $iv = "")
  string openssl_decrypt($data, $method, $password, $options = 1, $iv = "")   
 1.要先检查服务器是否已安装了openssl组件,没有则先安装好
      openssl version [-a]
2.加密参数说明:

      $data: 加密明文

      $method: 加密方法

      $passwd: 加密密钥

      $options: 数据格式选项(可选)

      $iv: 加密初始化向量(可选)

      解密参数

      $data: 解密密文

      $method: 解密加密方法

      $passwd: 解密密钥

      $options: 数据格式选项(可选),OpenSSL有两种模式: OPENSSL_RAW_DATA和OPENSSL_ZERO_PADDING

      

      $iv: 解密初始化向量(可选)

       例如使用openssl的rc4加密:

        

<?php
$plaintext = "message to be encrypted";
$cipher = "rc4";
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0);
    echo $ciphertext . "\n";
	//store $cipher, $iv, and $tag for decryption later
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}
?>
输出:

s336MsJQOBr+aT4FMk73A6RoBtOEqY8=
message to be encrypted

  

    
、    3.对称加密

      查询openssl支持的对称加密算法

      openssl_get_cipher_methods();

      

      生成公钥、私钥对

      生成原始RSA私钥文件rsa_private_key.pem

           openssl genrsa -out rsa_private_key.pem 1024

      

      生成RSA公钥 rsa_public_key.pem

        openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

      

 // 生成密钥资源id
  $pi_key = openssl_pkey_get_private($private_key);
  $pu_key = openssl_pkey_get_public($public_key);
  
  // 私钥加密  $encrypted变量存放加密后的字符串
  $encrypted = '';
  openssl_private_encrypt($data, $encrypted, $pi_key);
 
  // 转码
 $encrypted = base64_encode($encrypted);
 
 // 公钥解密,$decrypted变量存解密后的字符串
 $decrypted = ‘’;
 $encrypted = base64_decode($encrypted);
 openssl_public_decrypt($encrypted, $decrypted, $pu_key);

     4.PHP openssl和mcrypt扩展的区别

openssl是一种公私钥的网络通信安全协议,也算一种加密模式,php的openssl扩展是为了用这个协议加密和解密传输数据用的。与mcrypt相比,openssl支持更多的加密方法,使用更加简单,支持非对称加密解密,是安装签名https的核心组件。另外,mcrypt_encrpt已经不建议使用,php7.1已经废弃.

 





参考:
php加密案例
https://www.cnblogs.com/wicub/p/6395349.html
posted @ 2018-10-18 16:52  liqinggai  阅读(644)  评论(0编辑  收藏  举报