Bring Your Own Key (BYOK) は、Zoho の KEK の代わりに、お客様自身の鍵暗号化鍵 (KEK) を使用できる機能です。任意の外部キー管理システム (EKM) からキーを追加するか、暗号化済みキーを手動でアップロードできます。
キーのアップロードを選択した場合、処理の流れは次のとおりです:
通常の運用どおり、データは当社が管理する DEK を使用して暗号化され、当社の KMS に保存されます。さらに、その DEK は当社の KEK で暗号化され、別サーバーに保存されます。
お客様の KEK をアップロードするには、当社が提供する証明書から公開鍵を抽出し、その公開鍵を使ってお客様のキーを暗号化およびハッシュする必要があります。
暗号化された KEK とハッシュ化された KEK を Zoho One にアップロードします。
当社の KEK を使用して DEK を復号し、平文の DEK を取得します。
この平文の DEK を、お客様が提供した KEK を使用して暗号化します。
キーは、アプリケーションごとに個別に設定することも、2 つ以上のアプリケーションをグループ化して設定することも、組織内のすべてのアプリケーションで 1 つのキーを共用するように設定することもできます。
1. BYOK 証明書を追加する:
Zoho One にサインインし、 アイコンを右上でクリックします。
[Security] をクリックします。
[BYOK] をクリックし、右上の [Manage certificates ] をクリックします。
[Add certificates] をクリックし、証明書に一意の名前を入力して [Add] をクリックします。追加した証明書にカーソルを合わせ、ダウンロードアイコンをクリックします。
2. 暗号化された KEK を生成する:
前提条件:
バージョン 1.78.1 以上の 'bcprov-jdk18on' jar
次の Java コードスニペットを使用して、ダウンロードした証明書ファイルから公開鍵を抽出し、キーを暗号化します。
完全なコードスニペットを表示するにはこちらをクリックしてください
/**
* @param fileName
* - ダウンロードしたファイル名
* @param plainKeyBytes
* - 生成されたキーのバイト列
* @return - 暗号化されたキー
* @throws Exception
*/
public static String encryptKeyWithPublicKey(String fileName, byte[] plainKeyBytes) throws Exception {
PemReader reader = new PemReader(new FileReader(new File(fileName)));
PemObject pemObject = reader.readPemObject();
byte[] content = pemObject.getContent();
reader.close();
InputStream fin = new ByteArrayInputStream(content);
CertificateFactory f = CertificateFactory.getInstance('X.509');
X509Certificate certificate = (X509Certificate) f.generateCertificate(fin);
PublicKey pk = certificate.getPublicKey();
byte[] publicKeyBytes = pk.getEncoded();
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance('RSA');
PublicKey publicKey = keyFactory.generatePublic(keySpec);
Cipher encryptCipher = Cipher.getInstance('RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING');
OAEPParameterSpec oaepParams = new OAEPParameterSpec('SHA-256', 'MGF1', new MGF1ParameterSpec('SHA-256'), PSource.PSpecified.DEFAULT);
encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParams);
byte[] encryptedBytes = encryptCipher.doFinal(plainKeyBytes);
return Base64.getEncoder().encodeToString(encryptedBytes);
}
3. ハッシュ化された KEK を生成するには:
以下のコードスニペットを使用して AES キーのハッシュ値を生成します:
public staticString getHashValue(byte[] plainKeyBytes) throwsNoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance('SHA-256');
byte[] hashed = digest.digest(plainKeyBytes);
returnBase64.getEncoder().encodeToString(hashed);
}
4. キーをアップロードするには:
にサインインします。Zoho One を開き、左側のメニューでDirectoryをクリックします。
Admin Panelをクリックし、続いてSecurityをクリックします。
BYOKをクリックし、続いてSetupをクリックします。
Add key 画面で、Key name を入力し、applications を選択します。設定済みキーが利用できない場合のデータ復旧にこのキーを使用する場合は、availability key を有効化 し、key type としてUpload keyを選択します。
1 つのアプリには 1 つのキーしか適用できません。すでにキーが割り当てられているアプリは、Available applications には表示されません。
Key details で、すでに Encrypted KEK と Hashed KEK を生成済みの証明書のいずれかを選択します。
メモ: Available certificates の横にある+アイコンをクリックして証明書を追加し、上記の Java コードスニペットを使用して Encrypted KEK と Hashed KEK を生成できます。
Hashed KEK を .txt ファイルとして参照してアップロードします。
Encrypted KEK を .txt ファイルとして参照してアップロードします。
Addをクリックします。
1. BYOK 証明書を追加する:
にサインインします。Zoho One を開き、左側のメニューでDirectoryをクリックします。
Securityをクリックします。
BYOKをクリックし、右上のManage certificates をクリックします。
Add certificatesをクリックし、証明書に一意の名前を付けて、Addをクリックします。 追加した証明書にカーソルを合わせ、ダウンロードアイコンをクリックします。
2. Encrypted KEK を生成する:
前提条件:
バージョン 1.78.1 以上の 'bcprov-jdk18on' jar
次の Java コードスニペットを使用して、ダウンロードした証明書ファイルから公開鍵を抽出し、キーを暗号化します。
/**
* @param fileName
* - ダウンロードしたファイル名
* @param plainKeyBytes
* - 生成されたキーのバイト列
* @return - 暗号化されたキー
* @throws Exception
*/
public static String encryptKeyWithPublicKey(String fileName, byte[] plainKeyBytes) throws Exception {
PemReader reader = new PemReader(new FileReader(new File(fileName)));
PemObject pemObject = reader.readPemObject();
byte[] content = pemObject.getContent();
reader.close();
InputStream fin = new ByteArrayInputStream(content);
CertificateFactory f = CertificateFactory.getInstance('X.509');
X509Certificate certificate = (X509Certificate) f.generateCertificate(fin);
PublicKey pk = certificate.getPublicKey();
byte[] publicKeyBytes = pk.getEncoded();
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance('RSA');
PublicKey publicKey = keyFactory.generatePublic(keySpec);
Cipher encryptCipher = Cipher.getInstance('RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING');
OAEPParameterSpec oaepParams = new OAEPParameterSpec('SHA-256', 'MGF1', new MGF1ParameterSpec('SHA-256'), PSource.PSpecified.DEFAULT);
encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParams);
byte[] encryptedBytes = encryptCipher.doFinal(plainKeyBytes);
return Base64.getEncoder().encodeToString(encryptedBytes);
}
3. ハッシュ化された KEK を生成するには:
以下のコードスニペットを使用して AES キーのハッシュ値を生成します:
public staticString getHashValue(byte[] plainKeyBytes) throwsNoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance('SHA-256');
byte[] hashed = digest.digest(plainKeyBytes);
returnBase64.getEncoder().encodeToString(hashed);
}
4. キーをアップロードするには:
Admin Panel をクリックし、続いて Security をクリックします。
BYOK をクリックし、続いて Setup をクリックします。
すでにキーが追加されている場合は、右側の「+ Add key」をクリックします。
Add key 画面で、Key name を入力し、対象の applications を選択します。設定済みキーが利用できない場合のデータ復旧にこのキーを使用する場合は、availability key を有効にする をオンにし、key type として Upload key を選択します。
1 つのアプリには 1 つのキーしか適用できません。すでにキーが割り当てられているアプリは、Available applications には表示されません。
Key details で、すでに Encrypted KEK と Hashed KEK を生成済みの証明書のいずれか 1 つを選択します。
メモ: Available certificates の横にある+ アイコンをクリックして証明書を追加し、上記の Java コードスニペットを使用して Encrypted KEK と Hashed KEK を生成できます。
Hashed KEK を .txt ファイルとして参照してアップロードします。
Encrypted KEK を .txt ファイルとして参照してアップロードします。
Add をクリックします。