PHP opensll 加密和解密

简介

对称加密: 在加密和解密过程中使用相同的密钥, 或是两个可以简单地相互推算的密钥的加密算法.

非对称加密: 也称为公开加密, 它需要一个密钥对, 一个是公钥, 一个是私钥, 一个负责加密, 一个负责解密.

openssl 替代了早期的mcryp加解密,让加解密更加简单

对称性加密函数

查看openssl支持的所有加密方式

openssl_get_cipher_methods

获取 method 要求的初始化向量的长度.

openssl_cipher_iv_length($method) //#method 加密方式

openssl_random_pseudo_bytes($length) : 生成指定长度的伪随机字符串

openssl_encrypt — 加密数据

openssl_encrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string &$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] ) : string
  • data : 明文
  • method : 加密算法
  • key : 密钥
  • options :
    • 0 : 自动对明文进行 padding, 返回的数据经过 base64 编码.
    • 1 : OPENSSL_RAW_DATA, 自动对明文进行 padding, 但返回的结果未经过 base64 编码.
    • 2 : OPENSSL_ZERO_PADDING, 自动对明文进行 0 填充, 返回的结果经过 base64 编码. 但是, openssl 不推荐 0 填充的方式, 即使选择此项也不会自动进行 padding, 仍需手动 padding.
  • iv : 非空的初始化向量, 不使用此项会抛出一个警告. 如果未进行手动填充, 则返回加密失败.
  • tag 使用 AEAD 密码模式(GCM 或 CCM)时传引用的验证标签。
  • aad 附加的验证数据。
  • tag_length 验证 tag 的长度。GCM 模式时,它的范围是 4 到 16。

注意

  1. method 传入未知算法时,产生 E_WARNING 级别的错误。
  2. .iv 传入空字符串时产生 E_WARNING 级别的错误。

例子
GCM 模式的 AES 认证加密例子

$plaintext = "我是黑白课堂";
$cipher = "aes-128-gcm";
//判断是否支持的方法
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, $iv, $tag);
    //store $cipher, $iv, and $tag for decryption later
    //解密数据
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}

openssl_decrypt — 解密数据

openssl_decrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string $tag = "" [, string $aad = "" ]]]] ) : string

参数跟加密配置参数一样

hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = FALSE ] ) : string 使用 HMAC 方法生成带有密钥的哈希值

algo
要使用的哈希算法名称,例如:"md5","sha256","haval160,4" 等。 如何获取受支持的算法清单,请参见 hash_hmac_algos() 函数。

data
要进行哈希运算的消息。

key
使用 HMAC 生成信息摘要时所使用的密钥。

raw_output
设置为 TRUE 输出原始二进制数据, 设置为 FALSE 输出小写 16 进制字符串。

php5.6的AES加密

$plaintext = "我是黑白课堂";
//取得这个加密所需要的随机字符串长度
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
//生成这个随机长度字符串
$iv = openssl_random_pseudo_bytes($ivlen);
//加密数据,自动对明文进行 padding, 但返回的结果未经过 base64 编码.
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
// 生成带有密钥的哈希值,SHA256解密方法,
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
//base 64位
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );

//解密过程,先base64反出字符串..
$c = base64_decode($ciphertext);
//解密方法的所需要的长度
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
//截取获取向量
$iv = substr($c, 0, $ivlen);
//再获取hash的加密字符串,从向量往后计算,32个字符串
$hmac = substr($c, $ivlen, $sha2len=32);
//再来取得openssl_encrypt的加密字符串
$ciphertext_raw = substr($c, $ivlen+$sha2len);
//再来进行解密,加密数据,
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
//
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac))//PHP 5.6+ timing attack safe comparison
{
    echo $original_plaintext."\n";
}

提示

评论区 (0)

没有记录
支持 markdown,图片截图粘贴拖拽都可以自动上传。
黑白课堂

黑白课堂

混元大罗金仙 站长创业者玉树凌风每天醒来0收入

查看更多

最新视频课程

Laravel 的 PhpSpreadsheet 包入门

wap2App 入门讲解,100%速成,全面为你讲解。

ace.js 打造一款属于你的 Web 编辑器,入门文档。

Laravel Permission 中文文档

解释 OAuth 2.0 认证 和使用场景说明

Laravel 之 horizon 队列管理界面系统

钻级赞助商