客户端加密

Java sdk支持客户端加密, 将文件加密后再进行上传, 并在下载时进行解密。客户端加密支持对称AES与非对称RSA加密。 这里的对称和非对称只是用来加密每次生成的随机密钥, 对文件数据的加密始终使用AES256对称加密. 客户端加密适用于存储敏感数据的客户,客户端加密会牺牲部分上传速度, SDK内部对于分块上传会使用串行的方式进行上传。

使用客户端加密前准备事项

客户端加密内部使用AES256来对数据进行加密, 默认JDK6~JDK8早期的版本不支持256位加密, 如果运行时会报出以下异常java.security.InvalidKeyException: Illegal key size or default parameters. 那么我们需要补充oracle的JCE无政策限制权限文件, 将其部署在JRE的环境中. 请根据目前使用的JDK版本,分别下载对应的文件, 将其解压后保存在 JAVA_HOME下的jre/lib/security目录下.

  1. JDK6 JCE补充包
  2. JDK7 JCE补充包
  3. JDK8 JCE补充包

上传加密流程

  1. 每次上传一个文件对象前, 我们随机生成一个对称加密密钥, 随机生成的密钥通过用户的提供的对称或非对称密钥进行加密,将加密后的结果base64编码存储在对象的元信息中。
  2. 进行文件对象的上传, 上传时在内存使用AES256算法加密。

下载解密流程

  1. 获取文件元信息中加密必要的信息, base64解码后使用用户密钥进行解密,得到当时加密数据的密钥
  2. 使用密钥对下载输入流进行使用AES256解密,得到解密后的文件输入流。
  3. 示例

使用对称AES256加密每次生成的随机密钥示例(相关函数参考Java对称秘钥生成实例

public void upload(){
    buildAndSaveSymmetricKey();
    SecretKey symKey = loadSymmetricAESKey();
    EncryptionMaterials encryptionMaterials = new EncryptionMaterials(symKey);
    // 使用AES/GCM模式,并将加密信息存储在文件元信息中.
    CryptoConfiguration cryptoConf = new CryptoConfiguration(CryptoMode.AuthenticatedEncryption)
                .withStorageMode(CryptoStorageMode.ObjectMetadata);
    ClientConfiguration clientConfiguration = new ClientConfiguration();
    clientConfiguration.setIsSubdomain(true);
    client = new NOSEncryptionClient(new StaticCredentialsProvider(credentials),
                new StaticEncryptionMaterialsProvider(encryptionMaterials), clientConfiguration,
                cryptoConf);
    //NOSEncryptionClient对NOSClient进行了一层封装,使用NOSEncryptionClient与NOSClient方法完全一样,代码可以无缝切换。
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, createSampleFile());
    client.putObject(putObjectRequest);
    NOSObject object = client.getObject(putObjectRequest.getBucketName(), putObjectRequest.getKey());
}

使用非对称RSA加密每次生成的随机密钥示例 (相关函数参考Java非对称秘钥生成实例

public void upload(){
    buildAndSaveSymmetricKey();
    KeyPair keyPair=loadAsymKeyPair();
    EncryptionMaterials encryptionMaterials = new EncryptionMaterials(keyPair);
    // 使用AES/GCM模式,并将加密信息存储在文件元信息中.
    CryptoConfiguration cryptoConf = new CryptoConfiguration(CryptoMode.AuthenticatedEncryption)
                .withStorageMode(CryptoStorageMode.ObjectMetadata);
    ClientConfiguration clientConfiguration = new ClientConfiguration();
    clientConfiguration.setIsSubdomain(true);
    client = new NOSEncryptionClient(new StaticCredentialsProvider(credentials),
                new StaticEncryptionMaterialsProvider(encryptionMaterials), clientConfiguration,
                cryptoConf);
    //NOSEncryptionClient对NOSClient进行了一层封装,使用NOSEncryptionClient与NOSClient方法完全一样,代码可以无缝切换。
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, createSampleFile());
    client.putObject(putObjectRequest);
    NOSObject object = client.getObject(putObjectRequest.getBucketName(), putObjectRequest.getKey());
}