Encryption SDK is a client-side encryption library and is used with Key Management Service (KMS). これにより、データの暗号化、データの復号化、署名の生成、署名の検証を行うことができます。 このトピックでは、Encryption SDK for Javaを使用してデータを暗号化および復号化する方法について説明します。

このタスクについて

For more information about sample code, visit alibabacloud-encryption-sdk-java.

オンプレミスマシンに暗号化SDKをインストールする

  1. Encryption SDKをコンパイルしてインストールします。
    git clone https://github.com/aliyun/alibabacloud-encryption-sdk-java.git
    cd alibabacloud-暗号化-sdk-java
    mvnクリーンインストール-DskipTests
  2. Add a dependency to your project.
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>alibabacloud-encryption-sdk-java</artifactId>
        <version>1.0.7</version>
    </dependency>

MavenリポジトリからのEncryption SDKのインストール

プロジェクトにalibabacloud-encryption-sdk-javaの依存関係を追加します。 その後、プロジェクトは公開されたEncryption SDKのJavaパッケージをMavenリポジトリから自動的にダウンロードできます。

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>alibabacloud-encryption-sdk-java</artifactId>
    <version>1.0.x</version>
</dependency>
The latest version of Encryption SDK is 1.0.7. バージョンの詳細については、Alibaba Cloud Encryption SDK For Javaをご参照ください。

データの暗号化と復号化の例

  • バイト配列型のデータを暗号化および復号化します。
    publicクラスBasicEncryptionExample {
        private static final String ACCESS_KEY_ID = "<AccessKeyId>";
        プライベート静的ファイナル文字列ACCESS_KEY_SECRET = "<AccessKeySecret>";
        プライベート静的最終文字列CMK_ARN = "acs:kms:RegionId:UserId:key/CmkId";
        プライベート静的最終バイト [] PLAIN_TEXT = "Hello World".getBytes(StandardCharsets.UTF_8);
    
        public static void main(String[] args) {
            // 1. Alibaba Cloudにアクセスするためのパラメーターを設定します。 
            AliyunConfig config = new AliyunConfig();
            config.withAccessKey(ACCESS_KEY_ID、ACCESS_KEY_SECRET);
    
            // 2. SDKオブジェクトを作成し、Alibaba Cloudへのアクセスに使用するパラメーターを指定します。 
            AliyunCrypto aliyunSDK = new AliyunCrypto(config);
    
            // 3. データキーまたは署名を提供するプロバイダーを作成します。 
            BaseDataKeyProvider provider = new DefaultDataKeyProvider(CMK_ARN);
            // アルゴリズムを設定します。 デフォルトのアルゴリズムはAES_GCM_NOPADDING_256です。 
            //provider.setAlgorithm(CryptoAlgorithm.SM4_GCM_NOPADDING_128);
    
            // 4. Configure the encryption context. 
            Map<String, String> encryptionContext = new HashMap<>();
            encryptionContext.put("one", "one");
            encryptionContext.put("two" 、"two");
    
            // 5. EncryptおよびDecrypt操作を呼び出します。 
            CryptoResult<byte[]> cipherResult = aliyunSDK.encrypt(provider, PLAIN_TEXT, encryptionContext);
            CryptoResult<byte[]> plainResult = aliyunSDK.de crypt(provider, cipherResult.getResult());
    
            Assert.assertArrayEquals(PLAIN_TEXT, plainResult.getResult());
        }
    }
  • バイトストリーム型のデータを暗号化および復号化します。
    public class FileStreamSample {
        プライベート静的最終文字列FILE = "README.md";
        // accessKeyId accessKeySecret
        プライベート静的ファイナル文字列ACCESS_KEY_ID = "<AccessKeyId>";
        プライベート静的ファイナル文字列ACCESS_KEY_SECRET = "<AccessKeySecret>";
        // ログシステム。 
        プライベート静的最終ロガーLogger=LoggerFactory.getLogger(FileStreamSample.class);
        // Alibaba Cloud Resource Name (ARN) 形式のカスタマーマスターキー (CMK) のID。 
        private static final String CMK_ARN = "acs:kms:RegionId:UserId:key/CmkId";
    
        public static void main(String[] args) throws IOException {
            AliyunConfig config = new AliyunConfig();
            config.withAccessKey(ACCESS_KEY_ID、ACCESS_KEY_SECRET);
            encryptStream(config);
            decryptStream(config);
            Assert.assertEquals(getFileMD5(FILE), getFileMD5(FILE + ".decrypted"));
        }
    
        private static void encryptStream(AliyunConfig config) がIOException {
            // 1. SDKオブジェクトを作成し、Alibaba Cloudへのアクセスに使用するパラメーターを指定します。 
            AliyunCrypto aliyunSDK = new AliyunCrypto(config);
    
            // 2. 暗号化コンテキストを設定します。 
            final Map<String, String> encryptionContext = new HashMap<>();
            encryptionContext.put("this" 、"context");
            encryptionContext.put("あなたを助けることができます" 、"確認する");
            encryptionContext.put("this data" 、"is your original data");
    
            // 3. データキーを提供するプロバイダーを作成します。 
            BaseDataKeyProviderプロバイダー=新しいDefaultDataKeyProvider(CMK_ARN);
    
            // 4. 入力ストリームと出力ストリームを作成します。 
            FileInputStream inputStream=新しいFileInputStream(FILE);
            FileOutputStream outputStream=新しいFileOutputStream(FILE + ".encrypted");
    
            // 5. Encrypt操作を呼び出します。 
            try {
                aliyunSDK.encrypt(provider, inputStream, outputStream, encryptionContext);
            } catch (InvalidAlgorithmException e) {
                System.out.println("Failed.");
                System.out.println("エラーメッセージ:" + e.getMessage());
            }
        }
    
        private static void decryptStream(AliyunConfig config) throws IOException {
            // 1. SDKオブジェクトを作成し、Alibaba Cloudへのアクセスに使用するパラメーターを指定します。 
            AliyunCrypto aliyunSDK = new AliyunCrypto(config);
    
            // 2. データキーを提供するプロバイダーを作成します。 
            BaseDataKeyProviderプロバイダー=新しいDefaultDataKeyProvider(CMK_ARN);
    
            // 3. 入力ストリームと出力ストリームを作成します。 
            FileInputStream inputStream=新しいFileInputStream(FILE + ".encrypted");
            FileOutputStream outputStream=新しいFileOutputStream(FILE + ".decrypted");
    
            // 4. Call the Decrypt operation. 
            try {
                aliyunSDK.de crypt (プロバイダー、inputStream、outputStream);
            } catch (InvalidAlgorithmException e) {
                System.out.println("Failed.");
                System.out.println("エラーメッセージ:" + e.getMessage());
            }
        }
    
        プライベート静的文字列getFileMD5(String fileName) {
            ファイルファイル=新しいファイル (fileName);
            if  (!file.isFile()) {
                ヌルを返します。
            }
            MessageDigest digest;
            byte[] buffer = new byte[4096];
            try (FileInputStream in = new FileInputStream (ファイル)){
                digest = MessageDigest.getInstance("MD5");
                int len;
                while  ((len = in.read(buffer)) != -1) {
                    digest.update (バッファ、0、len);
                }
                を返しますHex.encodeHexString(digest.digest());
            } catch (例外e) {
                e.printStackTrace();
            }
            ヌルを返します。
        }
    }