🚧 improve image encryption and decryption
This commit is contained in:
82
common/hybrid_encrypt/README.md
Normal file
82
common/hybrid_encrypt/README.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# 混合加密图片方案
|
||||
|
||||
本模块提供了一套完整的混合加密解决方案,用于图片数据的安全传输。它使用RSA和AES-GCM混合加密方式,确保数据传输的安全性和效率。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. **混合加密**:使用RSA加密AES密钥,使用AES-GCM加密实际数据
|
||||
- 生成随机AES-256密钥
|
||||
- 使用RSA公钥加密AES密钥
|
||||
- 使用AES-GCM加密图片数据
|
||||
- 组合加密后的AES密钥、nonce和加密数据
|
||||
- 将结果进行Base64编码,便于网络传输
|
||||
|
||||
2. **混合解密**:使用RSA私钥解密AES密钥,使用AES-GCM解密数据
|
||||
- Base64解码密文
|
||||
- 分离加密的AES密钥、nonce和加密数据
|
||||
- 使用RSA私钥解密AES密钥
|
||||
- 使用解密后的AES密钥和nonce解密数据
|
||||
|
||||
## 后端使用方法 (Go)
|
||||
|
||||
```go
|
||||
// 生成RSA密钥对
|
||||
privateKey, _ := hybrid_encrypt.GenerateRSAKey(2048)
|
||||
|
||||
// 导出公钥和私钥为PEM格式
|
||||
pubPEM, _ := hybrid_encrypt.ExportPublicKeyPEM(&privateKey.PublicKey)
|
||||
privPEM := hybrid_encrypt.ExportPrivateKeyPEM(privateKey)
|
||||
|
||||
// 将PEM格式的密钥转换为Base64编码,便于在网络上传输
|
||||
base64PubKey := base64.StdEncoding.EncodeToString(pubPEM)
|
||||
base64PrivKey := base64.StdEncoding.EncodeToString(privPEM)
|
||||
|
||||
// 读取图片文件
|
||||
imageData, _ := ioutil.ReadFile("path/to/image.jpg")
|
||||
|
||||
// 使用公钥加密图片
|
||||
encryptedBase64, _ := hybrid_encrypt.EncryptImageWithBase64Key(base64PubKey, imageData)
|
||||
|
||||
// 将加密后的Base64字符串发送到前端
|
||||
// ...
|
||||
|
||||
// 如果需要在后端解密
|
||||
decryptedData, _ := hybrid_encrypt.DecryptImageWithBase64Key(base64PrivKey, encryptedBase64)
|
||||
```
|
||||
|
||||
## 前端使用方法 (JavaScript)
|
||||
|
||||
```javascript
|
||||
import { decryptImage } from './hybrid_encrypt_js.js';
|
||||
|
||||
// 从后端接收加密的图片数据和私钥
|
||||
const encryptedImageBase64 = '...'; // 从后端接收的Base64编码的加密图片数据
|
||||
const privateKeyPEM = '...'; // 从安全渠道获取的PEM格式RSA私钥
|
||||
|
||||
// 解密图片
|
||||
decryptImage(encryptedImageBase64, privateKeyPEM)
|
||||
.then(decryptedImageBase64 => {
|
||||
// 使用解密后的图片数据
|
||||
const imgElement = document.createElement('img');
|
||||
imgElement.src = decryptedImageBase64; // 直接设置为data:image/jpeg;base64,...格式
|
||||
document.body.appendChild(imgElement);
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('图片解密失败:', error);
|
||||
});
|
||||
```
|
||||
|
||||
## 安全注意事项
|
||||
|
||||
1. 私钥必须妥善保管,不应在不安全的渠道传输
|
||||
2. 对于大型图片,考虑分块加密和解密
|
||||
3. 在生产环境中,应使用至少2048位的RSA密钥
|
||||
4. 前端解密应在安全的环境中进行,避免私钥泄露
|
||||
|
||||
## 性能考虑
|
||||
|
||||
混合加密方案在处理大型数据(如高分辨率图片)时具有明显的性能优势:
|
||||
|
||||
- RSA仅用于加密小型AES密钥(32字节)
|
||||
- 大型图片数据使用高效的AES-GCM加密
|
||||
- 加密后的数据大小增加有限,主要是RSA加密的AES密钥部分
|
Reference in New Issue
Block a user