DES算法:已经被攻破不安全
$key = uniqid();
$md5_key = md5($key);
$vi = substr($md5_key, 0, 8);
$data = "hello world";
$method = "DES-CBC";
// 加密数据
$content = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $vi);
dump($content);
// 解密数据
$content = openssl_decrypt($content, $method, $key, OPENSSL_RAW_DATA, $vi);
dump($content);
AES算法:安全的对称加密算法
同DES差距在偏移量需要为16位
$key = uniqid();
$md5_key = md5($key);
$vi = substr($md5_key, 0, 16);
$data = "hello world";
$method = "AES-128-CBC";
// 加密数据
$content = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $vi);
dump($content);
// 解密数据
$content = openssl_decrypt($content, $method, $key, OPENSSL_RAW_DATA, $vi);
dump($content);
RSA算法:非对称加密(公钥加密私钥解密或私钥加密公钥解密)
$public = '公钥';
$private = '私钥';
// 公钥加密
$content = "hello world";
openssl_private_encrypt($content, $encrypt, $private);
dump($encrypt);
// 私钥解密
openssl_public_decrypt($encrypt, $decrypt, $public);
dump($decrypt);
Hash加密:md5()
api正常使用加密流程:
api客户端加密示例:
//API加密示例
// 秘钥对生成网址:http://web.chacuo.net/netrsakeypair
$public = '公钥';
// 1、参数编码
$appkey = "123";
$secretkey = "abc";
$url = "http://127.0.0.1/api.php/test/indexs?";
$params["appkey"] = $appkey;
$params["name"] = "Tom";
$params["time"] = time();
$queryString = http_build_query($params);
// 2、参数生成签名
ksort($params); // 按键排序
$q = http_build_query($params);
$q .= $secretkey;
$sign = md5($q);
$queryString .= "&sign=" . $sign;
// 3、公钥加密
openssl_public_encrypt($queryString, $encrypt, $public);
$encrypt = urlencode($encrypt);
$url .= "q=" . $encrypt;
//加密后请求地址
dump($url);
api服务端接收解密示例:
//API接收方解密示例
// 秘钥对生成网址:http://web.chacuo.net/netrsakeypair
$private = '私钥';
// 1、获取参数之后使用私钥解密
$q = $_GET["q"];
$decrypt = "";
openssl_private_decrypt($q, $decrypt, $private);
// 2、将字符串格式的参数转为数组
$params = [];
parse_str($decrypt, $params);
// 3、时间检验,控制url存活时间
if(abs($params["time"] - time()) >= 60){
echo "页面超时";die;
}
// 4、比对签名是否正确
$config = ["123" => "abc"];
//签名建议封装
$signs = $params["sign"];
unset($params["sign"]);
ksort($params);
$q = http_build_query($params);
$sign = md5($q . $config[$params["appkey"]]);
if ($sign != $signs){
echo "error";die;
}
echo "success";
https通讯原理:先通过rsa非对称加密传输秘钥后通过签名进行对称加密传输