适用于minio的文件内容文件路径加解密工具类(AES对称加密)

在使用minio的情况下,官方提供两种方案来做对象加密,分别是SSE-C、SSE-S3。但是在某些情况下我们受限于条件没法快速的通过以上方案实现加密,那么这个工具类可以帮助你,此加密过程经测试效率很不错,5MB的文件加密解密整个过程在800ms以内。 

import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

import io.minio.MinioClient;

public class EncryptionUtil {
    static final String originKeyStr = "0123456789Abc@@@"; // 必须16个字符
    private static SymmetricCrypto aes;

 
    // 加密并编码字符串
    public static String encryptURLEncodeStr(String str) {
        try {
            if (aes == null) {
                SecretKey aesKey = new SecretKeySpec(originKeyStr.getBytes(StandardCharsets.UTF_8), "AES");
                byte[] key = aesKey.getEncoded();
//构建
                aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
            }

//加密
            byte[] encrypt = aes.encrypt(str.getBytes(StandardCharsets.UTF_8));
            String s = Base64.getUrlEncoder().encodeToString(encrypt);
            return s;
        }catch (Exception e){
            e.printStackTrace();
        }
        return "";
    }

    // 解码并解密字符串
    public static String decryptURLDecodeStr(String encStr) {
        try {
            if (aes == null) {
                SecretKey aesKey = new SecretKeySpec(originKeyStr.getBytes(StandardCharsets.UTF_8), "AES");
                byte[] key = aesKey.getEncoded();
    //构建
                aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
            }

    //加密
                byte[] bytes = Base64.getUrlDecoder().decode(encStr);
                String s = aes.decryptStr(bytes);
                return s;
            }catch (Exception e){
                e.printStackTrace();
            }
        return "";
    }


// 加密并上传文件
    @SneakyThrows
    public static void encryptUpload(MinioClient minioClient, String bucketName, String objectName, InputStream inputStream) {
        if (aes == null) {
            SecretKey aesKey = new SecretKeySpec(originKeyStr.getBytes(StandardCharsets.UTF_8), "AES");
            byte[] key = aesKey.getEncoded();
//构建
            aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
        }

        byte[] bytes = new byte[inputStream.available()];
        inputStream.read(bytes, 0, bytes.length);
//加密
        byte[] encrypt = aes.encrypt(bytes);
        ByteArrayInputStream bais = new ByteArrayInputStream(encrypt);

        PutObjectOptions putObjectOptions = new PutObjectOptions(bais.available(), bais.available()< 5*1024*1024 ? 5*1024*1024 :  bais.available()*8);
        minioClient.putObject(bucketName, objectName, bais, putObjectOptions);
    }


// 下载文件并解密
    @SneakyThrows
    public static byte[] decryptDownload(MinioClient minioClient, String bucketName, String objectName) {
        if (aes == null) {
            SecretKey aesKey = new SecretKeySpec(originKeyStr.getBytes(StandardCharsets.UTF_8), "AES");
            byte[] key = aesKey.getEncoded();
            aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
        }

        InputStream inputStream = minioClient.getObject(bucketName, objectName);
        byte[] decrypt = aes.decrypt(inputStream);
        return decrypt;
    }

}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用以下代码示例来实现 MinIO 文件的分片下载: ```python import os import math from minio import Minio class MinioDownloader: def __init__(self, access_key, secret_key, endpoint, bucket_name): self.client = Minio(endpoint=endpoint, access_key=access_key, secret_key=secret_key, secure=False) self.bucket_name = bucket_name def download_file(self, object_name, output_dir, part_size=5 * 1024 * 1024): total_size = self.client.stat_object(self.bucket_name, object_name).size total_parts = math.ceil(total_size / part_size) if not os.path.exists(output_dir): os.makedirs(output_dir) with open(os.path.join(output_dir, object_name), 'wb') as file_data: for part_number in range(total_parts): offset = part_number * part_size length = min(part_size, total_size - offset) data = self.client.get_object(self.bucket_name, object_name, offset=offset, length=length) for d in data.stream(32 * 1024): file_data.write(d) print(f"File '{object_name}' downloaded successfully!") # 使用示例 access_key = 'your-access-key' secret_key = 'your-secret-key' endpoint = 'your-minio-endpoint' bucket_name = 'your-bucket-name' downloader = MinioDownloader(access_key, secret_key, endpoint, bucket_name) downloader.download_file('your-object-name', 'output-directory') ``` 在上述代码中,你需要将 `access_key`、`secret_key`、`endpoint` 和 `bucket_name` 替换为你自己的 MinIO 配置信息。然后,你可以创建一个 `MinioDownloader` 实例,并使用 `download_file` 方法来下载指定的文件。该方法将文件按照指定的分片大小下载,并将其保存在指定的输出目录中。请确保你已经安装了 `minio` 库。 希望这个工具类对你有帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值