网络人 > PHP技术 > PHP利用openssl_encrypt实现数据的加解密

PHP利用openssl_encrypt实现数据的加解密

$data = 'http://www.neter8.com'; //加密明文
$method = 'DES-ECB'; //加密方法
$passwd = '110'; //加密密钥
$options = 0; //数据格式选项(可选)
$result = openssl_encrypt($data, $method, $passwd, $options);
var_dump($result);//string(32) "XTEAhRrXSUUaXpFtQ/6xpFkML5cObhCX"
var_dump(openssl_decrypt($result, $method, $passwd, 0));//string(21) "http://www.neter8.com"

这是快速简单的加密和解密方法。常常用于数据交换防止被窃听。接收端只要密码正确就能还原内容。

下面是PHP 5.6+ 的 AES 认证加密例子,同样的内容每次输出字符都会变化(更安全)。

$key = '123456';//加密密码
$plaintext = "http://www.neter8.com/";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
var_dump($ciphertext);//string(108) "输入内容是变化的哦"

 下面是解密内容

$c = base64_decode($ciphertext);//解码base64
$ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len = 32);
$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+ 定时攻击安全性比较
{
    echo $original_plaintext;//http://www.neter8.com/
}

通过AES加解密对于数据传输更安全,同样的内容被抓包识别的可能性更低。

上面的代码是不是又多又复杂,好了,可以升级到PHP7.1+看看这样的代码满足你吗?

$key = '我是密码';
$plaintext = "http://www.neter8.com/";
$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);
    //使用 $cipher, $iv, and $tag 解密
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options = 0, $iv, $tag);
    echo $original_plaintext;//http://www.neter8.com/
}

除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:http://www.neter8.com/php/53.html

下一篇 »:自PHP5.4起可以使用短数组定义语法,用[]替代array()«上一篇:__DIR__与dirname(__FILE__)的效率哪个更高?

《PHP利用openssl_encrypt实现数据的加解密》的网友评论(0)

感谢打赏!