Key Management Service API参照書にショートカット >>
Key Management Serviceマニュアルにショートカット >>

サンプルコード: Best Practice

Key Management Serviceを利用して'エンベロープ暗号化(Envelope Encryption)'と'データキーの管理'を具現するサンプルコードです。エンベロープ暗号化に関する説明はKey Management Service使用ガイドをご参考ください。APIに関する説明はKey Management Service APIの概要をご参考ください。

ご利用の前に

サンプルコード参考の際の注意事項

本サンプルコードはKey Management Serviceのキーの利用をサポートするために、一般的に使用されるようなシナリオを想定して作成された例示のコードです。多様なシナリオに完璧に対応するようなコードではなく、例外処理などの作業は不十分なので、実際の使用においては注意が必要です。

API Keyの管理の際の注意事項

Key Management Serviceの暗号化/復号化機能はRest APIで利用できます。このようにプログラミング方式でアクセスする場合はKey Management Serviceに直接アクセスせず、API Gatewayを経由します。API GWはAPI Access keyを使用してユーザーの資格証明とアプリケーションの資格証明を確認します。それに関する詳しい説明はAPI Gatewayをご参考ください。

APIの資格証明にはサブアカウントの'access key', 'secret key'、そしてAPIの'api key'を使用します。サブアカウントのaccess key, secret keyはSub Accountサブアカウントの詳細画面で確認でき、APIのapi keyはAPI GatewayAPI Keysで作成および確認できます。

APIの資格証明に利用される情報を保有している人は誰でもKey Management Serviceのキーに対し、該当のキーの所有者が持つ権限と同じ権限でアクセスできます。 そのため、Key Management Serviceの権限を持っているユーザーにはKey Management Serviceのリソースを使用する際、共有責任のモデルに合わせようとする努力が必要です。

APIの資格証明情報の利用において次のことをご注意ください。

  • APIの資格証明情報(サブアカウントのaccess key, secret key)はコードに直接含まれてはいけません。
  • サービス/アプリケーションごとに異なる資格証明情報を利用しなければなりません。
  • 周期的にAPIの資格証明情報を更新します。
  • 周期的にKey Management Serviceのキーの使用履歴を確認し、許可されていないAPI呼び出しの状況を確認します。
  • 使用されていないAPIの資格証明情報は直ちに廃棄します。
KMS stage v1: API Gateway signature作成の例示
 private static String makeSignature(String uri , long timestamp) throws Exception {
   String message = new StringBuilder()
     .append("POST").append(" ").append(uri).append("\n")
     .append(timestamp).append("\n")
     .append(ncpApiKey).append("\n")
     .append(ncpAccessKey)
     .toString();

   SecretKeySpec signingKey = new SecretKeySpec(ncpSecretKey.getBytes("UTF-8"), "HmacSHA256");
   Mac mac = Mac.getInstance("HmacSHA256");
   mac.init(signingKey);
   byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
   String encodeBase64String = Base64.getEncoder().encodeToString(rawHmac);
   return encodeBase64String;
 }
KMS stage v2: API Gateway signature作成の例示
 private static String makeSignature(String uri , long timestamp) throws Exception {
   String message = new StringBuilder()
     .append("POST").append(" ").append(uri).append("\n")
     .append(timestamp).append("\n")
     .append(ncpAccessKey)
     .toString();

   SecretKeySpec signingKey = new SecretKeySpec(ncpSecretKey.getBytes("UTF-8"), "HmacSHA256");
   Mac mac = Mac.getInstance("HmacSHA256");
   mac.init(signingKey);
   byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
   String encodeBase64String = Base64.getEncoder().encodeToString(rawHmac);
   return encodeBase64String;
 }

クレデンシャルのエンベロープ暗号化(Envelope Encryption)

シナリオ

あなたはNAVERクラウドプラットフォームを使用中のウェブサービス会社のサーバ開発者で、ウェブサーバからDBにアクセスするためにDB認証情報を暗号化しなければならないという次のようなリクエストを受信しました。

  • DBの認証情報は暗号化されて保護されなければならない
  • すべての暗号化キーは標準勧告のレベルで適切に作成/運用/保護されなければならない

そのため、DBの認証情報をデータキーで暗号化し、データキーも同じように他のキーで暗号化して保管することにしました。データキーを暗号化する上位のキーであるマスタキーを利用するためにKey Management Serviceのキーに対するアクセスの権限を申し込みました。データキーを暗号化して復号化する必要があるため、Key Management Serviceのキーに対するEncryptor/Decryptorの権限を与えてもらった後、メールで受信したKey tagを確認しました。

すでにSub Accountを利用して知っていた自分のAccess keyとSecret keyを再び確認するためにNAVERクラウドプラットフォームコンソールのSub Accountにアクセスして確認した後、それをそれぞれ'NCP_ACCESS_KEY', 'NCP_SECRET_KEY'という名前の環境変数に設定しました。

また、Key Management Service APIを直接呼び出すためにAPI GatewayのAPI KeysでKey Management Serviceの専用のAPI keyを確認しましたが、ないことを確認し、アカウント管理者にKey Management Service用のAPI keyの作成をリクエストしました。アカウント管理者からKey Management Service APIは汎用のAPI keyを使っても構わないという確認を受けてから、汎用のAPI keyを自分の開発環境システムに'NCP_API_KEY'という名前の環境変数に設定しました。

データキーについても同じように暗号化キーの作成基準に従いたかったあなたはKey Management Serviceの'createCustomKey' APIを使って複雑なキー作成プロセスを自ら行う必要なく、high-entropyキーを作成できることを確認しました。

DBの認証情報の暗号化にはAES-CBCを利用するので、暗号化/復号化に利用される追加情報であるIV(Initial Vector)の値も一緒に管理されなければなりません。あなたはDBの認証情報とデータキー、そして追加的な暗号化関連情報を次のような'エンベロープ'の形のデータで管理することにしました。

{
  "ciphertext": "暗号化されたDBの認証情報",
  "wrappedKey": "暗号化されたデータの暗号化キー",
  "iv": "暗号化に使用される追加情報(ex. IVの値)"
}

これを作成するコードは次の通りです。

Javaコード

public class EncryptCredential {

  // URI
  private static String KMS_API_BASE_URI = "https://kms.apigw.ntruss.com";

  // END POINT
  private static String KMS_API_DECRYPT = "/keys/v1/%s/decrypt"; // Decryptorの権限が必要 (KMS API stage v1使用)
  //private static String KMS_API_DECRYPT = "/keys/v2/%s/decrypt"; // Decryptorの権限が必要 (KMS API stage v2使用)
  private static String KMS_API_CUSTOM_KEY = "/keys/v1/%s/createCustomKey"; // Encryptorの権限が必要 (KMS API stage v1使用)
  //private static String KMS_API_CUSTOM_KEY = "/keys/v2/%s/createCustomKey"; // Encryptorの権限が必要 (KMS API stage v2使用)

  // サンプル用のKEY TAG
  private static String KEY_TAG = "4165867476e68eca06e84c993708c23d22ca2cb6a51ac15750bd7e991ccadc39";

  private static String ncpAccessKey;
  private static String ncpSecretKey;
  private static String ncpApiKey;

  public static void main(String[] args) throws Exception {
    // APIの資格証明情報をシステムの環境変数に登録して使用
    ncpAccessKey = System.getenv("NCP_ACCESS_KEY");
    ncpSecretKey = System.getenv("NCP_SECRET_KEY");
    ncpApiKey = System.getenv("NCP_API_KEY");

    envelopCredential();
  }

  public static void envelopCredential() throws Exception {
    // 新しいhigh-entropyデータキーの作成をリクエスト
    String wrappedDataKey = getCustomKey();
    // 最終的に保護しようとする気密データ
    String example_credential_json = "{\"AUTH\":\"THIS_IS_A_DB_CREDENTIAL\"}}";

    // ユーザーが保管する暗号化されたデータのエンベロープ(Envelop encryptionをご参考)
    String envelope = encrypt(example_credential_json, wrappedDataKey);
    // 本例題では暗号化されたデータのエンベロープをファイルで保存
    File envelopeFile = new File("credentialEnvelope.json");
    OutputStream os = new BufferedOutputStream(new FileOutputStream(envelopeFile));

    try {
      os.write(envelope.getBytes());
    } finally {
      os.close();
    }
  }

  private static String encrypt(Object obj, String wrappedDataKey) throws Exception {
    Map<String, String> envelope = new HashMap<>();

    // データキーのunwrapping
    String dataKey = unwrapKey(wrappedDataKey);

    // 作成されたhigh-enrtopy 256 bitのデータキーをAES-CBC方式で暗号化
    SecretKey secretKey = new SecretKeySpec(decodeFromBase64(dataKey),"AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    byte[] iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
    byte[] ciphertext = cipher.doFinal(obj.toString().getBytes());

    envelope.put("wrappedKey", wrappedDataKey);
    envelope.put("ciphertext", encodeToBase64(ciphertext));
    envelope.put("iv", encodeToBase64(iv));

    return JSONValue.toJSONString(envelope);
  }

  private static String unwrapKey(String sealedKey) throws Exception {
    String endPoint = String.format(KMS_API_DECRYPT, KEY_TAG);

    JSONObject data = new JSONObject();
    data.put("ciphertext", sealedKey);
    JSONObject respJsonObject = apiCaller(endPoint, data.toJSONString());
    String plaintext = (respJsonObject.get("plaintext")).toString();
    return plaintext;
  }

  private static String getCustomKey() throws Exception {
    String endPoint = String.format(KMS_API_CUSTOM_KEY, KEY_TAG);

    JSONObject data = new JSONObject();
    data.put("requestPlainKey", false);
    JSONObject respJsonObject = apiCaller(endPoint, data.toJSONString());
    return respJsonObject.get("ciphertext").toString();
  }

  private static JSONObject apiCaller(String endPoint, String data) throws Exception {
    HttpClient client = HttpClients.createDefault();

    long timestamp = System.currentTimeMillis();
    String signature = makeSignature(endPoint, timestamp);
    URIBuilder uriBuilder = new URIBuilder(KMS_API_BASE_URI);
    uriBuilder.setPath(endPoint);

    HttpPost request = new HttpPost(uriBuilder.build().toString());
    request.addHeader("x-ncp-apigw-timestamp", timestamp + "");
    request.addHeader("x-ncp-apigw-api-key", ncpApiKey); // v1を使用する場合、必要
    //request.addHeader("x-ncp-apigw-api-key", ncpApiKey); // v2を使用する場合、不要
    request.addHeader("x-ncp-iam-access-key", ncpAccessKey);
    request.addHeader("x-ncp-apigw-signature-v1", signature);
    request.addHeader("Content-Type", "application/json");
    request.setEntity(new StringEntity(data));

    HttpResponse response = client.execute(request);
    String responseBody = EntityUtils.toString(response.getEntity());
    JSONParser parser = new JSONParser();
    JSONObject repsObj = (JSONObject) parser.parse(responseBody);
    JSONObject dataObj = (JSONObject) repsObj.get("data");
    return dataObj;
  }

  private static String encodeToBase64(byte[] bytesToEncode) {
    return Base64.getEncoder().encodeToString(bytesToEncode);
  }

  private static byte[] decodeFromBase64(String stringToDecode) {
    return Base64.getDecoder().decode(stringToDecode);
  }

  // API GW認証用のAPI呼び出しのシグネチャを作成 (API Gatewayマニュアルをご参考)
  private static String makeSignature(String uri , long timestamp) throws Exception {
    String message = new StringBuilder()
      .append("POST").append(" ").append(uri).append("\n")
      .append(timestamp).append("\n")
      .append(ncpApiKey).append("\n") // v1を使用する場合、必要
      //.append(ncpApiKey).append("\n") // v2を使用する場合、不要
      .append(ncpAccessKey)
      .toString();

    SecretKeySpec signingKey = new SecretKeySpec(ncpSecretKey.getBytes("UTF-8"), "HmacSHA256");
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(signingKey);
    byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
    String encodeBase64String = Base64.getEncoder().encodeToString(rawHmac);
    return encodeBase64String;
  }

}

作成の結果

{
  "ciphertext":"wh6wryZ5MUrzlzd7EW9OYNek+3taxNVnxAcUPBRR6vtDH29tDrFxLyNukqUT3s7i",
  "iv":"HDlrArTVqwHQJRx9IhtqzQ==",
  "wrappedKey":"ncpkms:v1:e0AGESFjKj7xFtCxW1zfGFyZ3G\/4mc51mAMMu1n2hHNLsI4X9h5NKRKx0avz+1ky7\/+7aCd5SAjCOlnV"
}

暗号化されたエンベロープ(Envelope)の使用

シナリオ

これからは、上のシナリオ通り暗号化処理をしたDBの認証情報の入った'エンベロープ'を実際のサーバのコードで利用しなければなりません。それをテストするために、あなたは次のコードを作成しました。DBへのアクセスの前にエンベロープの暗号文を復号化してDBの認証情報に変換します。

Javaコード

public class ClientApiSample {

  // URI
  private static String KMS_API_BASE_URI = "https://kms.apigw.ntruss.com";

  // END POINT
  private static String KMS_API_DECRYPT = "/keys/v1/%s/decrypt"; // Decryptorの権限が必要 (KMS API stage v1使用)
  //private static String KMS_API_DECRYPT = "/keys/v2/%s/decrypt"; // Decryptorの権限が必要 (KMS API stage v2使用)

  // KEY TAG
  private static String KEY_TAG = "1bc86ca1be3b062cf8503d0a7e6d3717fe3a1c0480e309b724b26bf961e1f3c6";

  private static String ncpAccessKey;
  private static String ncpSecretKey;
  private static String ncpApiKey;

  public static void main(String[] args) throws Exception {
    // APIの資格証明情報をシステムの環境変数に登録して使用
    ncpAccessKey = System.getenv("NCP_ACCESS_KEY");
    ncpSecretKey = System.getenv("NCP_SECRET_KEY");
    ncpApiKey = System.getenv("NCP_API_KEY");

    String dbCredential = getCredential();
  }

  public static String getCredential() throws Exception {
    // ユーザーが保管する暗号化されたデータのエンベロープ(Envelop encryptionをご参考)
    File envelopeFile = new File("credentialEnvelope.json");
    InputStream is = new BufferedInputStream(new FileInputStream(envelopeFile));

    String envelope = new String(Files.readAllBytes(Paths.get("credentialEnvelope.json")));
    JSONParser parser = new JSONParser();
    JSONObject envelopeJson = (JSONObject) parser.parse(envelope);
    String wrappedDataKey = envelopeJson.get("wrappedKey").toString();
    String ciphertext = envelopeJson.get("ciphertext").toString();
    String iv = envelopeJson.get("iv").toString();

    return decrypt(ciphertext, wrappedDataKey, iv);
  }

  private static String decrypt(String ciphertext, String wrappedDataKey, String iv) throws Exception {

    String dataKey = unwrapKey(wrappedDataKey);
    IvParameterSpec ivParameterSpec = new IvParameterSpec(decodeFromBase64(iv));
    SecretKey secretKey = new SecretKeySpec(decodeFromBase64(dataKey), "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
    byte[] plaintext = cipher.doFinal(decodeFromBase64(ciphertext));

    return new String(plaintext);
  }

  private static String unwrapKey(String sealedKey) throws Exception {
    String endPoint = String.format(KMS_API_DECRYPT, KEY_TAG);

    JSONObject data = new JSONObject();
    data.put("ciphertext", sealedKey);
    JSONObject respJsonObject = apiCaller(endPoint, data.toJSONString());
    String plaintext = (respJsonObject.get("plaintext")).toString();
    return plaintext;
  }

  private static JSONObject apiCaller(String endPoint, String data) throws Exception {
    HttpClient client = HttpClients.createDefault();

    long timestamp = System.currentTimeMillis();
    String signature = makeSignature(endPoint, timestamp);
    URIBuilder uriBuilder = new URIBuilder(KMS_API_BASE_URI);
    uriBuilder.setPath(endPoint);

    HttpPost request = new HttpPost(uriBuilder.build().toString());
    request.addHeader("x-ncp-apigw-timestamp", timestamp + "");
    request.addHeader("x-ncp-apigw-api-key", ncpApiKey); // v1を使用する場合、必要
    //request.addHeader("x-ncp-apigw-api-key", ncpApiKey); // v2を使用する場合、不要
    request.addHeader("x-ncp-iam-access-key", ncpAccessKey);
    request.addHeader("x-ncp-apigw-signature-v1", signature);
    request.addHeader("Content-Type", "application/json");
    request.setEntity(new StringEntity(data));

    HttpResponse response = client.execute(request);
    String responseBody = EntityUtils.toString(response.getEntity());
    JSONParser parser = new JSONParser();
    JSONObject repsObj = (JSONObject) parser.parse(responseBody);
    JSONObject dataObj = (JSONObject) repsObj.get("data");
    return dataObj;
  }

  private static byte[] decodeFromBase64(String stringToDecode) {
    return Base64.getDecoder().decode(stringToDecode);
  }

  // API GW認証用のAPI呼び出しのシグネチャを作成 (API Gatewayマニュアルをご参考)
  private static String makeSignature(String uri , long timestamp) throws Exception {
    String message = new StringBuilder()
      .append("POST").append(" ").append(uri).append("\n")
      .append(timestamp).append("\n")
      .append(ncpApiKey).append("\n") // v1を使用する場合、必要
      //.append(ncpApiKey).append("\n") // v2を使用する場合、不要
      .append(ncpAccessKey)
      .toString();

    SecretKeySpec signingKey = new SecretKeySpec(ncpSecretKey.getBytes("UTF-8"), "HmacSHA256");
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(signingKey);
    byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
    String encodeBase64String = Base64.getEncoder().encodeToString(rawHmac);
    return encodeBase64String;
  }

}

データキーの管理

シナリオ

上のようにクレデンシャルとデータキーを暗号化して一緒に結んで保管する方式は、データの保護の面では最も安全だと知られている方式です。しかし、これが全部ではありません。すべての暗号化キーは知られた暗号学的な脆弱性に備えて周期的に回転(更新)される必要があります。

あなたが上の例題を利用してKEY_TAGとして使っていたマスタキーは必須的に一定の周期(最大365日)ごとに自動で回転されるように設定されています。それだけでなく、Key Management Serviceの管理者(またはキー管理者)によって手動で回転される場合もあります。

あなたがDBの認証情報の暗号化に直接利用していたデータキーはマスタキーで暗号化されているので、マスタキーの回転設定をすれば同じように回転および保存される効果があります。ただし、マスタキーが回転されると、回転される前のマスタキーで暗号化されたあなたのデータキーも同じように新しく回転されたマスタキーで再暗号化 (reencrypt)しなければなりません。Key Management Serviceの'reencrypt' APIを使えば、簡単に再暗号化を行うことができます。'reencrypt' APIは最新のバージョンのキーで従来の暗号文を再暗号化します。

あなたはキーの使用権限が割り当てられる時にメールでアラームを受信したように、キーが回転された時もそれに関するアラームを受信します。アラームを受信したら、できるだけ早く再暗号化を行わなければなりません。そのために、あなたはキーの回転に関するアラームを受信した際に実行するコードを次のように作成しました。これから、データキーは回転された新しいバージョンで再暗号化され、新しいエンベロープを作成します。(エンベロープの紛失はデータの紛失と同じです。そのため、新しく作成されたエンベロープは直接確認してから以前のエンベロープを削除するのが安全です。そのために従来のエンベロープに上書きせず、新しいエンベロープを作成します。)

Javaコード

public class ClientApiSample {

  // URI
  private static String KMS_API_BASE_URI = "https://kms.apigw.ntruss.com";

  // END POINT
  private static String KMS_API_REENCRYPT = "/keys/v1/%s/reencrypt"; // KMS API stage v1使用
  // private static String KMS_API_REENCRYPT = "/keys/v2/%s/reencrypt"; // KMS API stage v2使用

  // KEY TAG
  private static String KEY_TAG = "1bc86ca1be3b062cf8503d0a7e6d3717fe3a1c0480e309b724b26bf961e1f3c6";

  private static String ncpAccessKey;
  private static String ncpSecretKey;
  private static String ncpApiKey;

  public static void main(String[] args) throws Exception {
    ncpAccessKey = System.getenv("NCP_ACCESS_KEY");
    ncpSecretKey = System.getenv("NCP_SECRET_KEY");
    ncpApiKey = System.getenv("NCP_API_KEY");

    reenvelopCredential();
  }

  private static void reenvelopCredential() throws Exception {
    String envelope = new String(Files.readAllBytes(Paths.get("credentialEnvelope.json")));
    JSONParser parser = new JSONParser();
    JSONObject envelopeJson = (JSONObject) parser.parse(envelope);
    String wrappedDataKey = envelopeJson.get("wrappedKey").toString();
    String ciphertext = envelopeJson.get("ciphertext").toString();
    String iv = envelopeJson.get("iv").toString();

    // 暗号化されたデータキーを最新のバージョンに再暗号化
    String rewrappedDataKey = rewrapKey(wrappedDataKey);

    Map<String, String> newEnvelope = new HashMap<>();
    // 暗号文とivはそのまま、再暗号化されたキーのみ変更すればいい
    newEnvelope.put("wrappedKey", rewrappedDataKey);
    newEnvelope.put("ciphertext", ciphertext);
    newEnvelope.put("iv", iv);

    String newEnvelopeJson = JSONValue.toJSONString(newEnvelope);

    // 新しいエンベロープを作成 (確認した後、従来のエンベロープの削除が必要)
    File newEnvelopeFile = new File("credentialEnvelope_new.json");
    OutputStream os = new BufferedOutputStream(new FileOutputStream(newEnvelopeFile));

    try {
      os.write(newEnvelopeJson.getBytes());
    } finally {
      os.close();
    }
  }

  private static String rewrapKey(String wrappedDataKey) throws Exception {
    String endPoint = String.format(KMS_API_REENCRYPT, KEY_TAG);

    JSONObject data = new JSONObject();
    data.put("ciphertext", wrappedDataKey);

    JSONObject respJsonObject = apiCaller(endPoint, data.toJSONString());
    String ciphertext = respJsonObject.get("newCiphertext").toString();
    return ciphertext;
  }

  private static JSONObject apiCaller(String endPoint, String data) throws Exception {
    HttpClient client = HttpClients.createDefault();

    long timestamp = System.currentTimeMillis();
    String signature = makeSignature(endPoint, timestamp);
    URIBuilder uriBuilder = new URIBuilder(KMS_API_BASE_URI);
    uriBuilder.setPath(endPoint);

    HttpPost request = new HttpPost(uriBuilder.build().toString());
    request.addHeader("x-ncp-apigw-timestamp", timestamp + "");
    request.addHeader("x-ncp-apigw-api-key", ncpApiKey); // v1を使用する場合、必要
    //request.addHeader("x-ncp-apigw-api-key", ncpApiKey); // v2を使用する場合、不要
    request.addHeader("x-ncp-iam-access-key", ncpAccessKey);
    request.addHeader("x-ncp-apigw-signature-v1", signature);
    request.addHeader("Content-Type", "application/json");
    request.setEntity(new StringEntity(data));

    HttpResponse response = client.execute(request);
    String responseBody = EntityUtils.toString(response.getEntity());
    JSONParser parser = new JSONParser();
    JSONObject repsObj = (JSONObject) parser.parse(responseBody);
    JSONObject dataObj = (JSONObject) repsObj.get("data");
    return dataObj;
  }

  private static String makeSignature(String uri , long timestamp) throws Exception {
    String message = new StringBuilder()
      .append("POST").append(" ").append(uri).append("\n")
      .append(timestamp).append("\n")
      .append(ncpApiKey).append("\n") // v1を使用する場合、必要
      //.append(ncpApiKey).append("\n") // v2を使用する場合、不要
      .append(ncpAccessKey)
      .toString();

    SecretKeySpec signingKey = new SecretKeySpec(ncpSecretKey.getBytes("UTF-8"), "HmacSHA256");
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(signingKey);
    byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
    String encodeBase64String = Base64.getEncoder().encodeToString(rawHmac);
    return encodeBase64String;
  }
}

作成の結果

{
  "ciphertext":"wh6wryZ5MUrzlzd7EW9OYNek+3taxNVnxAcUPBRR6vtDH29tDrFxLyNukqUT3s7i",
  "iv":"HDlrArTVqwHQJRx9IhtqzQ==",
  "wrappedKey":"ncpkms:v2:lNZubJHJ4coJConKPBf4gYghFN0h\/rjHmOBtvVbTXmXynRcKhPxPNrjkCTgurBZ4a7Fb7+\/8dVKcC33R"
}

Java Client SDK

Key Management Service Rest APIはJava SDK(Maven project)を提供しています。このSDKを利用すれば簡単にAPI Gatewayを使ってKey Management Service APIを呼び出すことができます。

[Key Management Service Java Client SDKのダウンロード]

接続準備

すべてのリクエストはApiClientオブジェクトを経由して呼び出されます。ApiClientオブジェクトは認証情報を設定して作成します。

認証情報設定

Key Management Service APIはAPI Gatewayを経由して呼び出され、API Gatewayに登録されたAPI Keyの認証とSub Accounts(IAM)の認証を行います。この情報はPropertiesFileCredentialsProviderオブジェクトを利用して設定できます。

type=iam
apiKey="API Gatewayに設定されたAPI Key"
accessKey="Sub Accountに設定されたサブアカウントのAccess Key"
secretKey="Sub Accountに設定されたサブアカウントのSecret Key"

上の内容をcredentials.propertiesという名前の認証情報ファイルで作成します。このファイルは流出しないように適切な保護とアクセスの制御が必要です。

クライアントオブジェクト設定

次のように予め定義された形のビルダでApiClientオブジェクトを作成できます。

public void setUp() {
  apiClient = new ApiClient.ApiClientBuilder()
    .addMarshaller(JsonMarshaller.getInstance())
    .addMarshaller(XmlMarshaller.getInstance())
    .addMarshaller(FormMarshaller.getInstance())
    .setCredentials(new PropertiesFileCredentialsProvider("credentials.properties").getCredentials()) // 認証情報設定
    .setLogging(true)
    .build();

  api = new V1Api(apiClient);
}

APIの呼び出し

それぞれのKey Management Service APIに対するメソッドが提供されます。Key Management Service APIを呼び出すためには正しいパラメータを送らなければなりません。keyTagは共通的に送られるパラメータであり、リクエストのbodyは各APIごとにクラス化されています。呼び出そうとするAPIに合うbodyオブジェクトを作成した後、パラメータを設定してください。パラメータに関する詳しい説明はKey Management Service Rest API Referenceをご参考ください。

Encrypt: keyTagEncryptPost(String keyTag, EncryptRequestBody body)

例題
public void keyTagEncryptPostTest() throws ApiException, SdkException {
    String keyTag = "53fdfdc1d875625d9cffc317e9c729c1febc5849328eb15b7b75ba17eb17e70c";
    EncryptRequestBody body = new EncryptRequestBody();
    String plaintext = Base64.getEncoder().encodeToString("This is a test.".getBytes());
    body.setPlaintext(plaintext);

    try {
        api.keyTagEncryptPost(keyTag, body);
        // Handler Successful response
    } catch (ApiException e) {
        // Handler Failed response
        e.printStackTrace();
    } catch (SdkException e) {
        // Handle exceptions that occurred before communication with the server
        e.printStackTrace();
    }
}

Decrypt: keyTagDecryptPost(String keyTag, DecryptRequestBody body)

例題
public void keyTagDecryptPostTest() throws ApiException, SdkException {
    String keyTag = "53fdfdc1d875625d9cffc317e9c729c1febc5849328eb15b7b75ba17eb17e70c";
    DecryptRequestBody body = new DecryptRequestBody();
    String ciphertext = "ncpkms:v1:eEEYwgBf/HGmqUEbTV/rASoJjneBjII+dOTnFYVOlvTnyw/+SFjwvjHpUg==";
    body.setCiphertext(ciphertext);

    try {
        api.keyTagDecryptPost(keyTag, body);
        // Handler Successful response
    } catch (ApiException e) {
        // Handler Failed response
        e.printStackTrace();
    } catch (SdkException e) {
        // Handle exceptions that occurred before communication with the server
        e.printStackTrace();
    }
}

Create user custom key: keyTagCreateCustomKeyPost(String keyTag, CreateCustomKeyRequestBody body)

例題
public void keyTagCreateCustomKeyPostTest() throws ApiException, SdkException {
    String keyTag = "53fdfdc1d875625d9cffc317e9c729c1febc5849328eb15b7b75ba17eb17e70c";
    CreateCustomKeyRequestBody body = new CreateCustomKeyRequestBody();
    body.setRequestPlainKey(true); // Required parameter
    body.setBits(512); // Optional parameter

    try {
        api.keyTagCreateCustomKeyPost(keyTag, body);
        // Handler Successful response
    } catch (ApiException e) {
        // Handler Failed response
        e.printStackTrace();
    } catch (SdkException e) {
        // Handle exceptions that occurred before communication with the server
        e.printStackTrace();
    }
}

Re-encrypt: keyTagReencryptPost(String keyTag, ReencryptRequestBody body)

例題
public void keyTagReencryptPostTest() throws ApiException, SdkException {
    String keyTag = "53fdfdc1d875625d9cffc317e9c729c1febc5849328eb15b7b75ba17eb17e70c";
    ReencryptRequestBody body = new ReencryptRequestBody();
    String ciphertext = "ncpkms:v1:eEEYwgBf/HGmqUEbTV/rASoJjneBjII+dOTnFYVOlvTnyw/+SFjwvjHpUg==";
    body.setCiphertext(ciphertext);

    try {
        api.keyTagReencryptPost(keyTag, body);
        // Handler Successful response
    } catch (ApiException e) {
        // Handler Failed response
        e.printStackTrace();
    } catch (SdkException e) {
        // Handle exceptions that occurred before communication with the server
        e.printStackTrace();
    }
}

Sign: keyTagSignPost(String keyTag, SignRequestBody body)

例題
public void keyTagSignPostTest() throws ApiException, SdkException {
    String keyTag = "4f81e47fae0a28dd50b9e5e0c3a204e371afa6d35b78b81cf802b80a2aa780ab";
    SignRequestBody body = new SignRequestBody();
    String data = "Test message";
    body.setData(Base64.getEncoder().encodeToString(data.getBytes()));

    try {
        api.keyTagSignPost(keyTag, body);
        // Handler Successful response
    } catch (ApiException e) {
        // Handler Failed response
        e.printStackTrace();
    } catch (SdkException e) {
        // Handle exceptions that occurred before communication with the server
        e.printStackTrace();
    }
}

Verify: keyTagVerifyPost(String keyTag, VerifyRequestBody body)

例題
public void keyTagVerifyPostTest() throws ApiException, SdkException {
    String keyTag = "4f81e47fae0a28dd50b9e5e0c3a204e371afa6d35b78b81cf802b80a2aa780ab";
    VerifyRequestBody body = new VerifyRequestBody();
    String data = "Test message";
    body.setData(Base64.getEncoder().encodeToString(data.getBytes()));
    body.setSignature("ncpkms:v1:MEUCIQDkn9k3voN2ABewgCAortmV4HVDXSok9bS+DX+GDd1hzAIgcIndWRNmx5j9zjMoDk9NYF3M5kk+KvRyYBVXGREVx1E=");

    try {
        api.keyTagVerifyPost(keyTag, body);
        // Handler Successful response
    } catch (ApiException e) {
        // Handler Failed response
        e.printStackTrace();
    } catch (SdkException e) {
        // Handle exceptions that occurred before communication with the server
        e.printStackTrace();
    }
}

関連情報のご確認

に対する検索結果は~件です。 ""

    に対する検索結果がありません。 ""

    処理中...