PHP:对称加密及url加密应用

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: PHP:对称加密及url加密应用

加密解决的问题

1、防止通信内容被窃听

2、防止通信内容被篡改

d17.1.jpg

对称加密 DES

Data Encryption Standard

可以被暴力破解

加密:明文 + 秘钥 -> DES加密 -> 密文
解密:密文 + 秘钥 -> DES解密 -> 明文

对称加密 Triple-DES

3次DES,性能较差

对称加密 AES

Advance Encryption Standard

安全的

加密:字节替换 -> 列移动 -> 混合列 -> 与秘钥进行XOR
解密:字节替换 <- 列移动 <- 混合列 <- 与秘钥进行XOR

DES代码实例

<?php
// 查看可用方法
// $ciphers = openssl_get_cipher_methods();
// var_dump($ciphers);
// 获取一定长度的秘钥
$key = uniqid();
var_dump($key);
$md5_key = md5($key);
var_dump($md5_key);
$vi = substr($md5_key, 0, 8);
var_dump($vi);
$data = "hello world";
$method = "DES-CBC";
// 加密数据
$content = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $vi);
var_dump($content);
// 解密数据
$content = openssl_decrypt($content, $method, $key, OPENSSL_RAW_DATA, $vi);
var_dump($content);

RSA非对称加密

# 公钥加密
密文 = 明文 E次方 mod N
公钥 = {E, N}
# 私钥解密
明文 = 密文 D次方 mod N
私钥 = {D, N}

缺点:运算速度慢

d17.2.jpg


RSA代码示例

<?php
// 秘钥对生成网址:http://web.chacuo.net/netrsakeypair
$public = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0HOTvtgR3rSeaun7RaGl
ECy2DCGVEd2fxCI8/MomgJoHYonpomtk8LzFC6UXApEzBK9Qe05x30cHMI0ejNtI
y9EtCkhgpVe8SDWA6volZjBZSOzF5FZmnMG+LV2eL60TnSHFeVGEl/qQxqM1143d
w4+Ymza+adfFDU2xBMobw5q37++9qwj8mrtviP7P8I+dOVNSCt/qIct+GdcBHSl/
N8V0XLmFnjPUiNGI90moeTMFUR5JQG7wxipsU4O/b2Ik92/2EpJ4/dnJBEKhsA9Z
Wedo0YOWXr0F7dO4xUfYqVvqdR0J67Meb4ah2mFBGLbaJ3I276QelBWvM13Mp+lA
EQIDAQAB
-----END PUBLIC KEY-----';
$private = '-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDQc5O+2BHetJ5q
6ftFoaUQLLYMIZUR3Z/EIjz8yiaAmgdiiemia2TwvMULpRcCkTMEr1B7TnHfRwcw
jR6M20jL0S0KSGClV7xINYDq+iVmMFlI7MXkVmacwb4tXZ4vrROdIcV5UYSX+pDG
ozXXjd3Dj5ibNr5p18UNTbEEyhvDmrfv772rCPyau2+I/s/wj505U1IK3+ohy34Z
1wEdKX83xXRcuYWeM9SI0Yj3Sah5MwVRHklAbvDGKmxTg79vYiT3b/YSknj92ckE
QqGwD1lZ52jRg5ZevQXt07jFR9ipW+p1HQnrsx5vhqHaYUEYttoncjbvpB6UFa8z
Xcyn6UARAgMBAAECggEBAJpv9tefJ+YzNWeKwUJ+l1ebeKkWPGaHJ3Zd04eKkeoX
tD76ZKGUJa4CfY66GokpYH4pEVy56r381sPO2gKL+Kwg5tjGdOwrS3DISyJMgGbs
jUntOlSI+u9Kz4a25Jr4BR8WxUKz9aPP3XF9vEdecR4RhoQAlCTA2tqXY/5jaxyI
bs6+kpN7hnKFMCQJ/T7/9UrIaNR9L3mcrQwjpcGBHPx7I2vZtkENMVh6D67ecEo0
i7g116/VexST9XKD1EJXdLlkmbx2YPSyKMnNQxRqWtazSXtMz9FaEMzMzXxwI4vQ
h7JW8LYYosI8hbrToj1AfQsbfl08WI+cnPZptPssUT0CgYEA8+P1cND+OHEMh73K
9HhoJN4rCBxdB7WJAlo7+WvmI5UTKnb4Vwx24Jm2KkAqFZYnrWInARyCjEK2EqBS
4jTiBCWKoG7fYd0YE+M3vOGZ/t8FMeSZLbBf0dcBqDbF8sp7x/SiTUGG8npED/5J
mJT9os6TsRMoCKFDkKhf3gTrYSMCgYEA2s0pI2UQO+ysWvu76339V6RzP4ZJdT5i
Tc+uwoNJ6gisitOovRfhdOiT29AxXKbh1Eib7ug6jlVpIXJQGVEcJIGPGq2dxZ3f
7Rx/XHAzsfw65nCJ80O4bjZkxFPT8P7c04hxUKI29wuSPEgzUnGVLDbKgwKlzUOK
NNbz5ZL4/zsCgYA8F+seBSDen1xLBgS///sJOoS31uVFRQGhRsKIToHCOrUiPXYr
XLLd3IH6Hx0/fGQCYLDjoTa5gKaEKGTDv+wAwY9KwIbiAiwwmkfdjmj3V9Rb2suz
akXx2lxaKkTT8fhV6H0lNAQgMugaWLmhkvR77RKPCv1OQw320sXsWqH0qQKBgFQK
AQcLRlT97qVzkxY8ahZDn9CCb6yMrY1de65SZw1xD3SzH1ih14Lj4gbHzG3d21eC
HAKDSBprS9oA4isXMEwFR0Xj8Xl5zgxwqaqDnhd63dSs3Q+Gr0wFsGaIHBuwiHjn
Kz7hT2NMGnr08GF2Jum4kcgIOE7C5k6tUTiYXvMJAoGBAIc+TEvBmnjPrupmToCI
OCFvUJtKrlEPACHU2Vut/g33/oVartWB4+6Wlmb57cfDdnHZRUNTom/BkGC4WDfa
d30Sc5hqeAINZD6557JkR/ZmIVgN90QFNCSJWOirYNzsLDlF0v6Weun6yQlygGim
+Ck7L+QHMgFEQQCYFd6ET5Cl
-----END PRIVATE KEY-----';
// 公钥加密
$content = "hello world";
$encrypt = "";
$ret = openssl_private_encrypt($content, $encrypt, $private);
var_dump($ret);
var_dump($encrypt);
// bool(true) string(256) ...
// 私钥解密
$decrypt = "";
$ret = openssl_public_decrypt($encrypt, $decrypt, $public);
var_dump($ret);
var_dump($decrypt);
// bool(true) string(11) "hello world"

中间人攻击

使用https较为安全

d17.3.jpg


中间人攻击

使用https较为安全

综合实践

rsa aes md5签名

ak appkey

sk secretkey

先通过客户端代码获取url,在访问服务端,服务端会进行校验,并返回结果

客户端代码

<?php 
$public = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0HOTvtgR3rSeaun7RaGl
ECy2DCGVEd2fxCI8/MomgJoHYonpomtk8LzFC6UXApEzBK9Qe05x30cHMI0ejNtI
y9EtCkhgpVe8SDWA6volZjBZSOzF5FZmnMG+LV2eL60TnSHFeVGEl/qQxqM1143d
w4+Ymza+adfFDU2xBMobw5q37++9qwj8mrtviP7P8I+dOVNSCt/qIct+GdcBHSl/
N8V0XLmFnjPUiNGI90moeTMFUR5JQG7wxipsU4O/b2Ik92/2EpJ4/dnJBEKhsA9Z
Wedo0YOWXr0F7dO4xUfYqVvqdR0J67Meb4ah2mFBGLbaJ3I276QelBWvM13Mp+lA
EQIDAQAB
-----END PUBLIC KEY-----';
// 1、参数编码
$appkey = "123";
$secretkey = "abc";
$url = "http://127.0.0.1:8009/server.php?";
$params["appkey"] = $appkey;
$params["name"] = "Tom";
$params["password"] = "123456";
$params["time"] = time();
$queryString = http_build_query($params);
// 2、参数生成签名
$sign = getSign($params, $secretkey);
$queryString .="&sign=" . $sign;
// 3、公钥加密
$encrypt = "";
openssl_public_encrypt($queryString, $encrypt, $public);
$encrypt = urlencode($encrypt);
$url .= "q=" . $encrypt;
var_dump($url);
// http://127.0.0.1:8009/server.php?
// appkey=123
// name=Tom
// password=123456
// time=1560870998
// sign=2f8c18c6bf072f6310375a66e7082648
function getSign($params, $secretkey){
    ksort($params); // 按键排序
    $q = http_build_query($params);
    $q .= $secretkey;
    return md5($q);
}

服务端代码

<?php
// 服务器端
$private = '-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDQc5O+2BHetJ5q
6ftFoaUQLLYMIZUR3Z/EIjz8yiaAmgdiiemia2TwvMULpRcCkTMEr1B7TnHfRwcw
jR6M20jL0S0KSGClV7xINYDq+iVmMFlI7MXkVmacwb4tXZ4vrROdIcV5UYSX+pDG
ozXXjd3Dj5ibNr5p18UNTbEEyhvDmrfv772rCPyau2+I/s/wj505U1IK3+ohy34Z
1wEdKX83xXRcuYWeM9SI0Yj3Sah5MwVRHklAbvDGKmxTg79vYiT3b/YSknj92ckE
QqGwD1lZ52jRg5ZevQXt07jFR9ipW+p1HQnrsx5vhqHaYUEYttoncjbvpB6UFa8z
Xcyn6UARAgMBAAECggEBAJpv9tefJ+YzNWeKwUJ+l1ebeKkWPGaHJ3Zd04eKkeoX
tD76ZKGUJa4CfY66GokpYH4pEVy56r381sPO2gKL+Kwg5tjGdOwrS3DISyJMgGbs
jUntOlSI+u9Kz4a25Jr4BR8WxUKz9aPP3XF9vEdecR4RhoQAlCTA2tqXY/5jaxyI
bs6+kpN7hnKFMCQJ/T7/9UrIaNR9L3mcrQwjpcGBHPx7I2vZtkENMVh6D67ecEo0
i7g116/VexST9XKD1EJXdLlkmbx2YPSyKMnNQxRqWtazSXtMz9FaEMzMzXxwI4vQ
h7JW8LYYosI8hbrToj1AfQsbfl08WI+cnPZptPssUT0CgYEA8+P1cND+OHEMh73K
9HhoJN4rCBxdB7WJAlo7+WvmI5UTKnb4Vwx24Jm2KkAqFZYnrWInARyCjEK2EqBS
4jTiBCWKoG7fYd0YE+M3vOGZ/t8FMeSZLbBf0dcBqDbF8sp7x/SiTUGG8npED/5J
mJT9os6TsRMoCKFDkKhf3gTrYSMCgYEA2s0pI2UQO+ysWvu76339V6RzP4ZJdT5i
Tc+uwoNJ6gisitOovRfhdOiT29AxXKbh1Eib7ug6jlVpIXJQGVEcJIGPGq2dxZ3f
7Rx/XHAzsfw65nCJ80O4bjZkxFPT8P7c04hxUKI29wuSPEgzUnGVLDbKgwKlzUOK
NNbz5ZL4/zsCgYA8F+seBSDen1xLBgS///sJOoS31uVFRQGhRsKIToHCOrUiPXYr
XLLd3IH6Hx0/fGQCYLDjoTa5gKaEKGTDv+wAwY9KwIbiAiwwmkfdjmj3V9Rb2suz
akXx2lxaKkTT8fhV6H0lNAQgMugaWLmhkvR77RKPCv1OQw320sXsWqH0qQKBgFQK
AQcLRlT97qVzkxY8ahZDn9CCb6yMrY1de65SZw1xD3SzH1ih14Lj4gbHzG3d21eC
HAKDSBprS9oA4isXMEwFR0Xj8Xl5zgxwqaqDnhd63dSs3Q+Gr0wFsGaIHBuwiHjn
Kz7hT2NMGnr08GF2Jum4kcgIOE7C5k6tUTiYXvMJAoGBAIc+TEvBmnjPrupmToCI
OCFvUJtKrlEPACHU2Vut/g33/oVartWB4+6Wlmb57cfDdnHZRUNTom/BkGC4WDfa
d30Sc5hqeAINZD6557JkR/ZmIVgN90QFNCSJWOirYNzsLDlF0v6Weun6yQlygGim
+Ck7L+QHMgFEQQCYFd6ET5Cl
-----END PRIVATE KEY-----';
// 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、比对签名是否正确
$sign = getSign($params);
if ($sign != $params["sign"]){
    echo "error";
    die;
}
echo "success";
function getSign($params){
    // 可以配置多个秘钥对
    $config = [
        "123" => "abc"
    ];
    unset($params["sign"]);
    ksort($params);
    $q = http_build_query($params);
    return md5($q . $config[$params["appkey"]]);
}

本文为课程笔记整理:

《PHP加密》课程地址:https://www.imooc.com/learn/1133

相关文章
|
1月前
|
设计模式 PHP
PHP中的设计模式:单一职责原则在软件开发中的应用
【10月更文挑战第8天】 在软件开发中,设计模式是解决常见问题的经验总结,而单一职责原则作为面向对象设计的基本原则之一,强调一个类应该只有一个引起变化的原因。本文将探讨单一职责原则在PHP中的应用,通过实际代码示例展示如何运用该原则来提高代码的可维护性和可扩展性。
33 1
|
6天前
|
SQL 安全 前端开发
PHP与现代Web开发:构建高效的网络应用
【10月更文挑战第37天】在数字化时代,PHP作为一门强大的服务器端脚本语言,持续影响着Web开发的面貌。本文将深入探讨PHP在现代Web开发中的角色,包括其核心优势、面临的挑战以及如何利用PHP构建高效、安全的网络应用。通过具体代码示例和最佳实践的分享,旨在为开发者提供实用指南,帮助他们在不断变化的技术环境中保持竞争力。
|
10天前
|
IDE PHP 开发工具
【PHP开发专栏】Xdebug在PHP调试中的应用
Xdebug 是一个功能强大的 PHP 扩展,提供调试、代码分析和性能分析等功能。本文介绍了 Xdebug 的基本概念、安装配置方法及在 PHP 调试中的应用技巧,包括断点调试、堆栈跟踪、远程调试和性能分析等。通过合理使用 Xdebug,可以显著提高调试效率和代码质量。
24 3
|
12天前
|
安全 编译器 PHP
PHP 8新特性解析与实践应用####
————探索PHP 8的创新功能及其在现代Web开发中的实际应用
|
16天前
|
测试技术 持续交付 PHP
PHP在Web开发中的应用与最佳实践###
【10月更文挑战第25天】 本文将深入探讨PHP在现代Web开发中的应用及其优势,并分享一些最佳实践来帮助开发者更有效地使用PHP。无论是初学者还是有经验的开发者,都能从中受益。 ###
38 1
|
19天前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
14 1
|
27天前
|
前端开发 安全 关系型数据库
PHP在Web开发中的应用及其优势###
【10月更文挑战第16天】 — 本文探讨了PHP在现代Web开发中的广泛应用及其显著优势。通过分析PHP的核心特性,如灵活性、易用性和广泛的应用支持,阐述了为何PHP成为众多开发者和公司的首选技术。文章还介绍了PHP与其他编程语言的比较,并展望了其未来的发展趋势。 ###
40 2
|
1月前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
1月前
|
小程序 物联网 API
PHP在哪些领域有应用?
【10月更文挑战第11天】PHP在哪些领域有应用?
42 2
|
1月前
|
运维 监控 物联网
PHP的应用的应用场景
【10月更文挑战第11天】PHP的应用的应用场景
9 1