PHP前后分离接口加密探讨( AES+RSA )

news2024/10/9 2:26:27

参考文章:

php之RSA加密解密_小吴-斌的博客-CSDN博客_php rsa加密

RSA和AES的区别_LC超人在良家的博客-CSDN博客_aes rsa

PHP实现非对称加密的方法 | 私钥及公钥加密解密的方法_php 公钥 私钥_LordForce的博客-CSDN博客

RSA非对称加密

特点:

只需交换公钥;公/秘钥机制,公钥加密,私钥解密;(或者私钥加密,公钥解密);

公钥负责加密,私钥负责解密;私钥负责签名,公钥负责验证。

非对称加密算法需要两个秘钥:公开密钥(publickey)和私有秘钥(privatekey).公开密钥和私有秘钥是一对,如果公开密钥对数据进行加密,只有用对应的私有秘钥才能解密;如果私有秘钥对数据进行加密那么只有用对应的公开密钥才能解密.因为加密解密使用的是两个不同的秘钥,所以这种算法叫做非对称加密算法.简单的说就是公钥加密私钥解密,私钥加密公钥解密

生成公私钥链接

http://web.chacuo.net/netrsakeypair

先来学习函数:

RSA 公钥加密 私钥解密 (公钥加密出来的内容每次刷新会改变)

openssl_public_encrypt() — 使用公钥加密数据

PHP: openssl_public_encrypt - Manual

openssl_private_decrypt — 使用私钥解密数据

PHP: openssl_private_decrypt - Manual

<?php

// 公钥
$public_key = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdUu486t87Nq7e+yniTH
g+CIT+fO5H5tTSn9rs6nYKd3agTVusHf5jz0+JYERqof6wHj5xrnyV9Qn3NhnBUT
gfkbTs28uiyBmHdN/t4dWNuUdRmNQdud8EX686Wkii9xiSP1jpLVbJ86S+BLsD2J
svcRecxUMpKvZxTTsNZIFZD+/XkozXgQh6FRoLzGr1vheTHKAB1pjfGHgaSpYPWu
sTwn8eLaqzQNAdaYHeRSrx9Et6z97WqEsv4fx4wBaiixHwkYwAnfSooOq49r/YgV
KOQDJBtt3OSyybxkwDLf/nTEVacO36Cf7h2g872YgF58DG+gicJWhwRujfIvkGHf
tQIDAQAB
-----END PUBLIC KEY-----';

// 私钥
$private_key = '-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCp1S7jzq3zs2rt
77KeJMeD4IhP587kfm1NKf2uzqdgp3dqBNW6wd/mPPT4lgRGqh/rAePnGufJX1Cf
c2GcFROB+RtOzby6LIGYd03+3h1Y25R1GY1B253wRfrzpaSKL3GJI/WOktVsnzpL
4EuwPYmy9xF5zFQykq9nFNOw1kgVkP79eSjNeBCHoVGgvMavW+F5McoAHWmN8YeB
pKlg9a6xPCfx4tqrNA0B1pgd5FKvH0S3rP3taoSy/h/HjAFqKLEfCRjACd9Kig6r
j2v9iBUo5AMkG23c5LLJvGTAMt/+dMRVpw7foJ/uHaDzvZiAXnwMb6CJwlaHBG6N
8i+QYd+1AgMBAAECggEBAKOObkDwC3CWSpVo8WEB1K85rq0ddo9w/jyBAxG1bVZV
EVil3VulWMZ30AgTGX0gW+rMgDpSHAU/6PoWeVuCpK3YRKdI1ceKEyjNROz95c9s
cHWxrOtO4LTEAGFjFaoK9NF5MwQifq3ETrVCBkJtkU4sSMU+tZuazpd8ZD56ryMs
VbAvmtHurn502C3+cksW0krqyMUtyZzwAf1ysjC/6kqk+tbd8tSzZ9tB//IQEYsF
JC7N8bN5SnjHJxucVdiiMRUqO6zQGfA7b7gMRLXM0nE9XmaXHKiHKV8HJGPBiJ8f
S7bHcAGWa1m+Q/dzOwQx5arI1x9xcC7oER2SwzFgiiECgYEA2GujCNdDl2UT0UaF
9l4Nq94O2oOg2/PRm7DvQkZ4Xb4xJFtxpQkJu0rP4cq53dSTjUGBA2hiCm4lzrKL
AA8MjhsPBFnldEFjQOI0fC7Y1g+ydh0L6lbj49Eod4YcG3Qf2L+Az4lr5A7ww274
2xrh4R8SsvyJg+Q5UpWl3hF0d00CgYEAyORnr4di9VHVS604K96UHluJZL94dycY
d2MxAmraNFsSjWTVRC0LeGtkluwhBQCtpzJpB14eeVgHGqqhl5LATMu86RRs1y+Z
A+/6MzUEeunNkNMBueJ1Vx3smWNSzOSrU+inV2W5DUTJLx7C2x0ZHCKa7wj3hXOC
tDViH/RFZgkCgYEAxoMkzq01sJ7kaKe5pVxsSeOr2D+4w0iIUbkgHbiqG8KjLOg7
+9eod4WN3Vyo1JNyrLUS899BXrPeNhSLb4heSdMEGUekMtjvg8p5vhbyipdnaPQH
w/Hjo0ptRgVbrsr7k0NFkhhJQK17pqgZ2FB2NJrd+hOux64F7nyZ4nI8VFkCgYBg
f98SoS02/GVCIeYepJ9v6baY76S1T9Ff4AT1zVAd4DWMOAh95EljQesi2DCQT6Aa
9YsgH+TxkwhuldJjlfnLqf6H0+jogRO2oXsFSA1r4Y1+aO2mVhLZkyVJFT378Egg
WVyxDcsThZxChztAt7yNGE5mTl9f+nmpiQ8mnFcNyQKBgQDAACbgjNOStirsdAtJ
1numHm3zZ42ZPtv6UWlcy5SGJxKwuAeCSpsiz6qKbLStkxF7R0Qio4X0WTf8WWH4
NPwyxlHjEU3WKX8jsrRVCzRE9yURfhO2avO1bg1MwOJoodRQ0lJEMcrPhRXdq3L0
zkCvTA6kfgk/GSmKp4IoKNFS9Q==
-----END PRIVATE KEY-----';

$data = json_encode(['name'=>'ki','age'=>99,'city'=>'河南','gender'=>'男'],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);

$public_key = openssl_pkey_get_public($public_key);    // 判断公钥是否可用
if (!$public_key) {
    echo "公钥不可用";
    exit;
}
$isSuccess = openssl_public_encrypt($data,$encrypt_data,$public_key);

echo $isSuccess;
echo "<hr>";
echo $encrypt_data;
echo "<hr>";

$private_key = openssl_pkey_get_private($private_key);   // 判断私钥是否可用
if (!$private_key) {
    echo "私钥不可用";
    exit;
}
$isSuccess = openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key);
echo $isSuccess;
echo "<hr>";
echo $decrypt_data;
echo "<hr>";

RSA 私钥签名 公钥验签

openssl_sign — 生成签名

PHP: openssl_sign - 手动

openssl_verify — 验证签名

PHP: openssl_verify - Manual

<?php

// 公钥
$public_key = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdUu486t87Nq7e+yniTH
g+CIT+fO5H5tTSn9rs6nYKd3agTVusHf5jz0+JYERqof6wHj5xrnyV9Qn3NhnBUT
gfkbTs28uiyBmHdN/t4dWNuUdRmNQdud8EX686Wkii9xiSP1jpLVbJ86S+BLsD2J
svcRecxUMpKvZxTTsNZIFZD+/XkozXgQh6FRoLzGr1vheTHKAB1pjfGHgaSpYPWu
sTwn8eLaqzQNAdaYHeRSrx9Et6z97WqEsv4fx4wBaiixHwkYwAnfSooOq49r/YgV
KOQDJBtt3OSyybxkwDLf/nTEVacO36Cf7h2g872YgF58DG+gicJWhwRujfIvkGHf
tQIDAQAB
-----END PUBLIC KEY-----';

// 私钥
$private_key = '-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCp1S7jzq3zs2rt
77KeJMeD4IhP587kfm1NKf2uzqdgp3dqBNW6wd/mPPT4lgRGqh/rAePnGufJX1Cf
c2GcFROB+RtOzby6LIGYd03+3h1Y25R1GY1B253wRfrzpaSKL3GJI/WOktVsnzpL
4EuwPYmy9xF5zFQykq9nFNOw1kgVkP79eSjNeBCHoVGgvMavW+F5McoAHWmN8YeB
pKlg9a6xPCfx4tqrNA0B1pgd5FKvH0S3rP3taoSy/h/HjAFqKLEfCRjACd9Kig6r
j2v9iBUo5AMkG23c5LLJvGTAMt/+dMRVpw7foJ/uHaDzvZiAXnwMb6CJwlaHBG6N
8i+QYd+1AgMBAAECggEBAKOObkDwC3CWSpVo8WEB1K85rq0ddo9w/jyBAxG1bVZV
EVil3VulWMZ30AgTGX0gW+rMgDpSHAU/6PoWeVuCpK3YRKdI1ceKEyjNROz95c9s
cHWxrOtO4LTEAGFjFaoK9NF5MwQifq3ETrVCBkJtkU4sSMU+tZuazpd8ZD56ryMs
VbAvmtHurn502C3+cksW0krqyMUtyZzwAf1ysjC/6kqk+tbd8tSzZ9tB//IQEYsF
JC7N8bN5SnjHJxucVdiiMRUqO6zQGfA7b7gMRLXM0nE9XmaXHKiHKV8HJGPBiJ8f
S7bHcAGWa1m+Q/dzOwQx5arI1x9xcC7oER2SwzFgiiECgYEA2GujCNdDl2UT0UaF
9l4Nq94O2oOg2/PRm7DvQkZ4Xb4xJFtxpQkJu0rP4cq53dSTjUGBA2hiCm4lzrKL
AA8MjhsPBFnldEFjQOI0fC7Y1g+ydh0L6lbj49Eod4YcG3Qf2L+Az4lr5A7ww274
2xrh4R8SsvyJg+Q5UpWl3hF0d00CgYEAyORnr4di9VHVS604K96UHluJZL94dycY
d2MxAmraNFsSjWTVRC0LeGtkluwhBQCtpzJpB14eeVgHGqqhl5LATMu86RRs1y+Z
A+/6MzUEeunNkNMBueJ1Vx3smWNSzOSrU+inV2W5DUTJLx7C2x0ZHCKa7wj3hXOC
tDViH/RFZgkCgYEAxoMkzq01sJ7kaKe5pVxsSeOr2D+4w0iIUbkgHbiqG8KjLOg7
+9eod4WN3Vyo1JNyrLUS899BXrPeNhSLb4heSdMEGUekMtjvg8p5vhbyipdnaPQH
w/Hjo0ptRgVbrsr7k0NFkhhJQK17pqgZ2FB2NJrd+hOux64F7nyZ4nI8VFkCgYBg
f98SoS02/GVCIeYepJ9v6baY76S1T9Ff4AT1zVAd4DWMOAh95EljQesi2DCQT6Aa
9YsgH+TxkwhuldJjlfnLqf6H0+jogRO2oXsFSA1r4Y1+aO2mVhLZkyVJFT378Egg
WVyxDcsThZxChztAt7yNGE5mTl9f+nmpiQ8mnFcNyQKBgQDAACbgjNOStirsdAtJ
1numHm3zZ42ZPtv6UWlcy5SGJxKwuAeCSpsiz6qKbLStkxF7R0Qio4X0WTf8WWH4
NPwyxlHjEU3WKX8jsrRVCzRE9yURfhO2avO1bg1MwOJoodRQ0lJEMcrPhRXdq3L0
zkCvTA6kfgk/GSmKp4IoKNFS9Q==
-----END PRIVATE KEY-----';

$data = json_encode(['name'=>'ki','age'=>99,'city'=>'河南','gender'=>'男'],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);

/**
 * 公钥加密 私钥解密
 */
// $public_key = openssl_pkey_get_public($public_key);    // 判断公钥是否可用
// if (!$public_key) {
//     echo "公钥不可用";
//     exit;
// }
// $isSuccess = openssl_public_encrypt($data,$encrypt_data,$public_key);
//
// echo $isSuccess;
// echo "<hr>";
// echo $encrypt_data;
// echo "<hr>";
//
// $private_key = openssl_pkey_get_private($private_key);   // 判断私钥是否可用
// if (!$private_key) {
//     echo "私钥不可用";
//     exit;
// }
// $isSuccess = openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key);
// echo $isSuccess;
// echo "<hr>";
// echo $decrypt_data;
// echo "<hr>";

/**
 *
 */
// 私钥签名
openssl_sign($data, $signature, $private_key);
$sign = base64_encode($signature);

var_dump($sign);
echo "<hr>";


// 公钥验签  需要用加密前的数据
echo openssl_verify($data, base64_decode($sign), $public_key);

RSA 私钥加密 公钥解密  (私钥加密出来的内容永远不会变)

openssl_private_encrypt — 使用私钥加密数据

PHP: openssl_private_encrypt - Manual

openssl_public_decrypt — 使用公钥解密数据

PHP: openssl_public_decrypt - Manual

<?php

// 公钥
$public_key = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdUu486t87Nq7e+yniTH
g+CIT+fO5H5tTSn9rs6nYKd3agTVusHf5jz0+JYERqof6wHj5xrnyV9Qn3NhnBUT
gfkbTs28uiyBmHdN/t4dWNuUdRmNQdud8EX686Wkii9xiSP1jpLVbJ86S+BLsD2J
svcRecxUMpKvZxTTsNZIFZD+/XkozXgQh6FRoLzGr1vheTHKAB1pjfGHgaSpYPWu
sTwn8eLaqzQNAdaYHeRSrx9Et6z97WqEsv4fx4wBaiixHwkYwAnfSooOq49r/YgV
KOQDJBtt3OSyybxkwDLf/nTEVacO36Cf7h2g872YgF58DG+gicJWhwRujfIvkGHf
tQIDAQAB
-----END PUBLIC KEY-----';

// 私钥
$private_key = '-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCp1S7jzq3zs2rt
77KeJMeD4IhP587kfm1NKf2uzqdgp3dqBNW6wd/mPPT4lgRGqh/rAePnGufJX1Cf
c2GcFROB+RtOzby6LIGYd03+3h1Y25R1GY1B253wRfrzpaSKL3GJI/WOktVsnzpL
4EuwPYmy9xF5zFQykq9nFNOw1kgVkP79eSjNeBCHoVGgvMavW+F5McoAHWmN8YeB
pKlg9a6xPCfx4tqrNA0B1pgd5FKvH0S3rP3taoSy/h/HjAFqKLEfCRjACd9Kig6r
j2v9iBUo5AMkG23c5LLJvGTAMt/+dMRVpw7foJ/uHaDzvZiAXnwMb6CJwlaHBG6N
8i+QYd+1AgMBAAECggEBAKOObkDwC3CWSpVo8WEB1K85rq0ddo9w/jyBAxG1bVZV
EVil3VulWMZ30AgTGX0gW+rMgDpSHAU/6PoWeVuCpK3YRKdI1ceKEyjNROz95c9s
cHWxrOtO4LTEAGFjFaoK9NF5MwQifq3ETrVCBkJtkU4sSMU+tZuazpd8ZD56ryMs
VbAvmtHurn502C3+cksW0krqyMUtyZzwAf1ysjC/6kqk+tbd8tSzZ9tB//IQEYsF
JC7N8bN5SnjHJxucVdiiMRUqO6zQGfA7b7gMRLXM0nE9XmaXHKiHKV8HJGPBiJ8f
S7bHcAGWa1m+Q/dzOwQx5arI1x9xcC7oER2SwzFgiiECgYEA2GujCNdDl2UT0UaF
9l4Nq94O2oOg2/PRm7DvQkZ4Xb4xJFtxpQkJu0rP4cq53dSTjUGBA2hiCm4lzrKL
AA8MjhsPBFnldEFjQOI0fC7Y1g+ydh0L6lbj49Eod4YcG3Qf2L+Az4lr5A7ww274
2xrh4R8SsvyJg+Q5UpWl3hF0d00CgYEAyORnr4di9VHVS604K96UHluJZL94dycY
d2MxAmraNFsSjWTVRC0LeGtkluwhBQCtpzJpB14eeVgHGqqhl5LATMu86RRs1y+Z
A+/6MzUEeunNkNMBueJ1Vx3smWNSzOSrU+inV2W5DUTJLx7C2x0ZHCKa7wj3hXOC
tDViH/RFZgkCgYEAxoMkzq01sJ7kaKe5pVxsSeOr2D+4w0iIUbkgHbiqG8KjLOg7
+9eod4WN3Vyo1JNyrLUS899BXrPeNhSLb4heSdMEGUekMtjvg8p5vhbyipdnaPQH
w/Hjo0ptRgVbrsr7k0NFkhhJQK17pqgZ2FB2NJrd+hOux64F7nyZ4nI8VFkCgYBg
f98SoS02/GVCIeYepJ9v6baY76S1T9Ff4AT1zVAd4DWMOAh95EljQesi2DCQT6Aa
9YsgH+TxkwhuldJjlfnLqf6H0+jogRO2oXsFSA1r4Y1+aO2mVhLZkyVJFT378Egg
WVyxDcsThZxChztAt7yNGE5mTl9f+nmpiQ8mnFcNyQKBgQDAACbgjNOStirsdAtJ
1numHm3zZ42ZPtv6UWlcy5SGJxKwuAeCSpsiz6qKbLStkxF7R0Qio4X0WTf8WWH4
NPwyxlHjEU3WKX8jsrRVCzRE9yURfhO2avO1bg1MwOJoodRQ0lJEMcrPhRXdq3L0
zkCvTA6kfgk/GSmKp4IoKNFS9Q==
-----END PRIVATE KEY-----';

$data = json_encode(['name'=>'ki','age'=>99,'city'=>'河南','gender'=>'男'],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);

/**
 * 公钥加密 私钥解密
 */
// $public_key = openssl_pkey_get_public($public_key);    // 判断公钥是否可用
// if (!$public_key) {
//     echo "公钥不可用";
//     exit;
// }
// $isSuccess = openssl_public_encrypt($data,$encrypt_data,$public_key);
//
// echo $isSuccess;
// echo "<hr>";
// echo $encrypt_data;
// echo "<hr>";
//
// $private_key = openssl_pkey_get_private($private_key);   // 判断私钥是否可用
// if (!$private_key) {
//     echo "私钥不可用";
//     exit;
// }
// $isSuccess = openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key);
// echo $isSuccess;
// echo "<hr>";
// echo $decrypt_data;
// echo "<hr>";

/**
 * 私钥加密 公钥解密
 */
$private_key = openssl_pkey_get_private($private_key);   // 判断私钥是否可用
if (!$private_key) {
    echo "私钥不可用";
    exit;
}
$isSuccess = openssl_private_encrypt($data,$encrypt_data,$private_key);
echo $isSuccess;
echo "<hr>";
echo $encrypt_data;
echo "<hr>";

$public_key = openssl_pkey_get_public($public_key);    // 判断公钥是否可用
if (!$public_key) {
    echo "公钥不可用";
    exit;
}

$isSuccess = openssl_public_decrypt($encrypt_data, $decrypt_data, $public_key);
echo $isSuccess;
echo "<hr>";
echo $decrypt_data;
echo "<hr>";

AES对称加密

对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。
对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。
对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。
对称加密,加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。

先来学习函数:

openssl_encrypt() — 加密数据

PHP: openssl_encrypt - Manual

openssl_decrypt— 解密数据

PHP: openssl_decrypt - Manual

推荐自己经常用的随机数生成 ( 可用来生成iv 和 key )

在线随机密码生成器-随机字符串生成器

<?php


$key = '6gA^PNB9x_aY^qbl';

$iv = 'EVi%N+N%Q6BtNtt9';

$method = "AES-128-CBC";

$data = json_encode(['name'=>'ki','age'=>99,'city'=>'河南','gender'=>'男'],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);

// 加密
$encrypt = base64_encode(openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv));
echo $encrypt;
echo "<hr>";


$decrypt =  openssl_decrypt(base64_decode($encrypt), $method, $key, OPENSSL_RAW_DATA, $iv);
echo $decrypt;
echo "<hr>";

 怎么使用?参考gitee上别人开源代码:

AES-RSA: PHP和JS前后端数据加解密

看了上面的代码 我画了一张流程图

疑问与总结

1.因为是随机key和iv做到了一次一密 ( 但是传输了加密的key 和 iv 个人觉得iv可以都是固定的 这样节省时间 )

2.后端返回响应数据是使用了私钥生成的签名  签名验签是需要公钥 和 原来没加密的数据 以及加密后的数据 返回的是布尔值  验签是为了确定是否可以使用 前端接受的数据里面也返回了没加密的key 和 iv 感觉验签是多此一举

3.服务端返回相应数据 不如干净利落使用前端公钥加密key 和 iv 前端使用前端的私钥解密 

4.加密本身就是损失性能换来更高的安全性 但是要记住没有破解不了的加密 只要前端/APP被反编译出来,加密是没用的 

5.个人感觉不如一个简单的AES加密即可 把前端/App 重要代码 混淆加固加密来的更实在

自己可以根据上面的加密方式来进行自己想要的加密,基本加密内容就是上面列出来的,可以在此基础上玩点花活,我参考的几个博客里面每个人都有不同的加解密,但是基础都是上面列出来的加密方式

补充:

关于前端其实就是两个包

npm install crypto-js


npm install jsencrypt

相关代码 参考上面开源链接里面写好的

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2、python框架Unitter轻量级框架

类与对象定义 面向过程与面向对象 面向过程编程&#xff1a; 根据操作数据的函数或语句块来设计程序的。 面向对象编程&#xff1a; 数据和功能结合起来&#xff0c;用称为对象的东西包裹起来组织程序的方法&#xff1b; 在大多数时候你可以使用面向过程编程&#xff0c;…

Hudi系列11:Flink CDC 将MySQL的数据写入Hudi

文章目录一. 下载依赖包二. 源端数据准备三. 使用Flink cdc mysql连接器创建flinkSQL映射表四. 创建FlinkSQL Hudi连接器创建hudi表五. 将数据从CDC表插入hudi表六. 测试增删改参考:一. 下载依赖包 将 flink-sql-connector-mysql-cdc-2.2.1.jar 下载后&#xff0c;上传到$FLIN…

动手深度学习-欠拟合和过拟合

目录训练误差和泛化误差K-折交叉验证欠拟合和过拟合模型复杂性数据集大小权重衰减权重衰减简洁实现暂退法&#xff08;Dropout&#xff09;从零开始实现Dropout简洁实现参考教程&#xff1a;https://courses.d2l.ai/zh-v2/ 训练误差和泛化误差 训练误差&#xff08;training …

5000字带你了解机房搬迁有哪些步骤?干货收藏!

机房搬迁不仅仅是把机房的设备迁移到新机房那么简单&#xff0c;而是要求网络系统的迁移和集中存储系统的迁移必须安全平稳&#xff0c;不能过长时间影响生产应用。表面上就是几个IT 民工的搬运&#xff0c;但实际是一项目高度集中的体力与脑力的综合项目。现将一般机房搬迁步骤…

基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Go语言进阶和依赖管理(二)——并发和依赖管理

文章目录一、本文重点内容&#xff1a;二、详细知识点介绍&#xff1a;1、并发和并行并发&#xff1a;并行&#xff1a;结论&#xff1a;2、Go的协程协程&#xff1a;线程&#xff1a;3、协程通信方式一&#xff1a;使用通道交换数据方式二&#xff1a;使用共享内存完成数据交换…

SpringBoot 与 SpringCloud 有什么区别?

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;SpringBoot 与 SpringCloud 有什么区别&#xff1f; ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&am…

深拷贝,浅拷贝,引用拷贝有什么区别?

目录 引用拷贝 浅拷贝 深拷贝 深拷贝,浅拷贝,引用拷贝有什么区别? 引用拷贝 当我们向复制一个对象的时候,自然想到的就是赋值,直接赋值给另外一个变量,这种做法只是赋值了对象的地址,即两个变量现在指向的是同一个对象,任意一个对象操作这个属性都会影响到另外一个变量,这…

成为一名网络安全工程师,你应该学习什么?

前言 这是我的建议如何成为网络安全工程师&#xff0c;你应该按照下面顺序学习。 简要说明 第一件事你应该学习如何编程&#xff0c;我建议首先学python&#xff0c;然后是java。 &#xff08;非必须&#xff09;接下来学习一些算法和数据结构是很有帮助的&#xff0c;它将帮…

jQuery select三级联动

功能描述&#xff1a; 1 实现三级联动&#xff0c;ajax请求数据。 根据选定级别&#xff0c;查询该级别下的项目类别&#xff1b;根据选择类别&#xff0c;查询该级别类别下所属项目列表&#xff1b; 前端涉及知识点&#xff1a; &#xff08;1&#xff09;(‘#app’).change…

【云原生kubernetes】k8s控制器Deployment使用详解

前言 在上一篇我们聊了k8s中各种控制器的使用&#xff0c;本篇将以控制器中比较常用的一种控制器Deployment 进行详细的说明。 一、Deployment 简介 为了更好解决服务编排的问题&#xff0c;kubernetes在V1.2版本开始&#xff0c;引入了Deployment控制器&#xff1b; 需要说明…

47 转置卷积【动手学深度学习v2】】

47 转置卷积【动手学深度学习v2】】 深度学习学习笔记 学习视频&#xff1a;https://www.bilibili.com/video/BV17o4y1X7Jn/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source75dce036dc8244310435eaf03de4e330 转置卷积 卷积不会增大输入的高…

【Python小游戏】99%的人都不知道,“猜数字”游戏这么玩才能快速胜出,少年,要不要来猜猜看啊~(附源码)

前言 日子从不亏欠&#xff0c;每一个努力向上的人&#xff0c; 未来的走运, 都是过往尽力的积累。 人勤春来早&#xff0c;奋进正当时。新春伊始&#xff0c;我们迎来了2023年开工第一天。 栗子同学恭祝大家开工大吉&#xff0c;新年新气象&#xff0c;万事开门红&#xff…

Spring事务案例:模拟银行转账

Spring事务案例&#xff1a;模拟银行转账一. 概念二. 原程序2.1 表&#xff1a;2.2 service层接口&#xff1a;2.3 dao层接口&#xff1a;2.4 service实现类&#xff1a;2.5 测试用例&#xff1a;三.使用事务改进3.1 开启注解式事务驱动&#xff1a;3.2 开启事务&#xff1a;3.…

python使用pptx库-从一个ppt复制页面到另一个ppt里面

python使用pptx库-从一个ppt复制页面到另一个ppt里面 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、原理 如题&#xff0c;我有一个模板课件.pptx&#xff1a; 其内容&#xf…

百趣代谢组学文献分享:大麦盐胁迫响应机制的组学分析

前言 百趣代谢组学文献分享&#xff0c;我国受盐碱化危害耕地面积超过1.4亿亩&#xff0c;严重危险粮食安全和三农问题的解决。因此开发耐盐农作物并研究其耐盐机制具有迫在眉睫的重要意义。 代谢组学文献分享&#xff0c;浙江大学吴德志教授研究组最近发表的研究成果比较了耐…

Jmeter之界面语言设置

一、临时性设置中文 临时性设置&#xff1a;设置后只对本次使用有效&#xff0c;重启Jmeter后恢复默认语言。 选择Options—>Choose Language—>选择其他语言&#xff08;例如&#xff1a;Chinese&#xff08;Simplified&#xff09;简体中文&#xff09;设置成功。重启…

32 基变换和图像压缩

一、知识概要 本节主题是线性变换与矩阵的关联&#xff0c;从图像压缩与信号处理的应用引入&#xff0c;介绍几种方便的基向量&#xff1a;傅里叶&#xff0c;小波。最后从代数角度大体上介绍了基变换与变换矩阵的关系。 二、图像处理 首先我们假设有一个 512 * 512 的黑白图…

StarRocks斩获「2022 掘金引力榜」年度技术品牌传播案例 Top 10!

近日&#xff0c;由稀土掘金技术社区打造的「掘金引力榜」正式公布&#xff0c;由StarRocks社区举办的StarRocks Summit Asia 2022荣获「掘金引力榜 2022 年度技术品牌传播案例 Top10」&#xff01;掘金是面向全球中文开发者的技术社区。「掘金引力榜」是由稀土掘金技术社区打造…

【MyBatis持久层框架】配置文件实现增删改查实战案例(下)

前言 前面我们学习了 MyBatis 持久层框架的原生开发方式和 Mapper 代理开发两种方式&#xff0c;解决了使用 JDBC 基础性代码操作数据库时存在的硬编码和操作繁琐的问题。 在配置文件实现增删改查上篇中&#xff0c;我们详细讲解了常用的查询操作&#xff0c;例如查询所有数据…