Skip to content

Latest commit

 

History

History
143 lines (103 loc) · 5.25 KB

how-to-use-aws-sdk-java-encryption.md

File metadata and controls

143 lines (103 loc) · 5.25 KB

如何使用AWS SDK for Java给Minio Server进行加密 Slack

aws-sdk for Java是java语言版本的官方AWS SDK。本文我们将学习如何使用aws-sdk for Java给Minio Server进行加密,使用对称加密和非对称加密。

加密可以给一些存储在Minio Server的敏感的用户数据(图片, 音频等)提供额外的安全性。

前提条件

官方AWS SDK for Java文档下载并安装aws-sdk for Java。

对称加密

对称加密使用同一个key进行加密和解密。以下是使用AES进行对称加密的步骤:

1. 生成AES key

使用Java KeyGenrator类生成一个256位的AES key。

    // 生成256位AES key.
    KeyGenerator symKeyGenerator = KeyGenerator.getInstance("AES");
    symKeyGenerator.init(256);
    SecretKey symKey = symKeyGenerator.generateKey();

2. 使用生成的key创建AWS S3加密客户端。

    EncryptionMaterials encryptionMaterials = new EncryptionMaterials(
      mySymmetricKey);

    // 添加 Minio Server accessKey和secretKey  
    AWSCredentials credentials = new BasicAWSCredentials(
      "USWUXHGYZQYFYFFIT3RE", "MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03");

    // 创建以Minio Server做为endpoint的加密client。
    AmazonS3EncryptionClient encryptionClient = new AmazonS3EncryptionClient(
      credentials, new StaticEncryptionMaterialsProvider(
      encryptionMaterials));
    Region usEast1 = Region.getRegion(Regions.US_EAST_1);
    encryptionClient.setRegion(usEast1);
    encryptionClient.setEndpoint("http://localhost:9000");

3. 使用AWS S3加密客户端操作Minio。

使用前面步骤创建的加密客户端操作Minio Server。

    // 创建存储桶
    encryptionClient.createBucket(bucketName);

    // 使用加密client上传文件
    byte[] plaintext = "Hello World, S3 Client-side Encryption Using Asymmetric Master Key!"
      .getBytes();
    System.out.println("plaintext's length: " + plaintext.length);
    encryptionClient.putObject(new PutObjectRequest(bucketName, objectKey,
    new ByteArrayInputStream(plaintext), new ObjectMetadata()));

4. 测试

文件下载之后,验证解密后的文件是否和之前上传到Minio Server的原文件是否相同。

    // 下载文件
    S3Object downloadedObject = encryptionClient.getObject(bucketName,
    objectKey);
    byte[] decrypted = IOUtils.toByteArray(downloadedObject
    .getObjectContent());

    // 验证数据是否一致
    Assert.assertTrue(Arrays.equals(plaintext, decrypted));

完整的AES加密代码在这里

非对称加密

非对称加密使用公钥进行加密,私钥进行解密。以下是使用RSA进行非对称加密的步骤:

1. 生成RSA key

    // 生成RSA key pair
    KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance(algorithm);
    keyGenerator.initialize(1024, srand);
    keyGenerator.generateKeyPair();

2. 使用生成的key创建AWS S3加密客户端。

    EncryptionMaterials encryptionMaterials = new EncryptionMaterials(
      loadedKeyPair);

    // 添加 Minio Server accessKey和secretKey
    AWSCredentials credentials = new BasicAWSCredentials("USWUXHGYZQYFYFFIT3RE",
      "MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03");	   

    // 创建以Minio Server做为endpoint的加密client。
    AmazonS3EncryptionClient encryptionClient = new AmazonS3EncryptionClient(
      credentials, new StaticEncryptionMaterialsProvider(encryptionMaterials));
    Region usEast1 = Region.getRegion(Regions.US_EAST_1);
    encryptionClient.setRegion(usEast1);
    encryptionClient.setEndpoint("http://localhost:9000");

3. 使用AWS S3加密客户端操作Minio。

使用前面步骤创建的加密客户端操作Minio Server。

    // 创建存储桶
    encryptionClient.createBucket(bucketName);

    // 上传文件
    byte[] plaintext = "Hello World, S3 Client-side Encryption Using Asymmetric Master Key!"
      .getBytes();
    System.out.println("plaintext's length: " + plaintext.length);
    encryptionClient.putObject(new PutObjectRequest(bucketName, objectKey,
    new ByteArrayInputStream(plaintext), new ObjectMetadata()));

4. 测试

文件下载之后,验证解密后的文件是否和之前上传到Minio Server的原文件是否相同。

    // 下载文件
    S3Object downloadedObject = encryptionClient.getObject(bucketName,
      objectKey);
    byte[] decrypted = IOUtils.toByteArray(downloadedObject
      .getObjectContent());
    Assert.assertTrue(Arrays.equals(plaintext, decrypted));

    // 验证数据是否一致
    System.out.println("decrypted length: " + decrypted.length);

完整的RSA加密代码在这里

注意:当Minio生成一个presignedURL,它代表的是一个加密后的对象。所以,如果通过其它方法比如curl下载这个对象,你得到的将会是一个加密后的对象。这是因为curl对加密的事一无所知。