2019.02.14

Salesforceの暗号化にApex Crypto クラスを使ってみた

データの安全性を高めるため、Salesforceプラットフォーム上はいろんな仕組みが提供されています。プログラミングユーティリティとして、CryptoというApexクラスも用意されています。
Apex Crypto クラスのメソッドは、機密データの暗号化と復号、ダイジェスト、メッセージ認証コード、および署名の作成を行うための標準アルゴリズムを提供します。これらは、Salesforce のコンテンツのセキュリティを確保したり、Google、Amazon WebServices (AWS) などの外部サービスと統合するために使用できます。
普段は使う機会があまりないので、このクラスの使い方について少し調べてみました。

機密データとは

国や業界などにもよりますが、一般的に下記のデータが機密データとみなされます。
  • パスワード
  • パスフレーズ
  • 暗号化キー
  • OAuth アクセストークン
  • クレジットカードナンバー
  • 個人情報(名前、電話番号、メールアドレス、性別、収入、住所など)
  • ネットワーク機器情報( MAC アドレス、シリアルナンバー、IPアドレスなど)
  • 機密データを収集、処理するときに特別な手順が必要になります。
機密データを収集、処理するときに特別な手順が必要になります。

Cryptoクラスの概要

Cryptoクラスは通常、以下のセキュリティ性を強化するために使用されます。
  • 機密性 - 保管中または転送中のデータの保護
  • 完全性 - データは完全かつ正確
  • 信頼性 - メッセージの送信者または受信者の信頼性の証明

暗号化及び復号

CryptoクラスはAES(Advanced Encryption Standard)アルゴリズム(AES128、AES192、およびAES256)を使用してデータを暗号化および復号する機能で構成されています。現在、AESアルゴリズムを使用した対称秘密鍵暗号化のみがサポートされていますので、暗号化と復号が同じ鍵を使用します。
暗号化はデータ保護のみを提供しますが、送信者を認証せず、メッセージの整合性も保証しません。

ハッシュダイジェストの生成

一方向ハッシュ関数を使用してデータを固定長でユニークな「ダイジェスト」に変換します。ダイジェストは一意であるため、送信されたダイジェストを同じアルゴリズムを使用して受信されたデータから計算されたダイジェストと比較することによって、データの完全性を保証できます。

メッセージ認証コードの生成

ハッシュダイジェストの仕組みとよく似ていますが、MAC(Message Authentication Codes)関数は、ダイジェストを生成したあと、秘密鍵を使用してダイジェストを暗号化します(共通鍵暗号方式)。
秘密鍵が受信者にも共有され、受診者は共有秘密鍵を使用してMACを復号して、データが改竄されていないことを確認できるとともに、正しい送信者から送られたものであるという認証も可能となります。

デジタル署名の生成

デジタル署名は、非対称鍵(公開鍵、秘密鍵)を使用してメッセージの整合性と信頼性の両方を保証します。送信者はダイジェストを生成し、それを秘密鍵に使用して暗号化します。次に、受信者は公開鍵を使用してダイジェストを復号し、受信メッセージから生成されたダイジェストと比較します。

Apex Cryptoクラスがサポートする規格

以下は、Cryptoクラスの各メソッドでサポートしているさまざまな業界規格です。
機能 メソッド 業界規格
暗号化、復号 encrypt() encryptWithManagedIV() decrypt() decryptWithManagedIv() AES128、AES192、AES256、暗号解読ブロックチェーン (CBC) および PKCS5 パディング
ハッシュダイジェスト生成 generateDigest() MD5、SHA1、 SHA256、 SHA512
メッセージ認証コードの生成 generateMac() verifyMac() MD5、SHA1、 SHA256、 SHA512
デジタル署名 sign() signWithCertificate() verify() RSA-SHA1、RSA-SHA256
以下暗号化と復号およびデジタル署名の実装について少し詳しくお話します。

暗号化及び復号の使用例

Apex Cryptoクラスのメソッドは、AESアルゴリズムを使用して暗号化および復号化する機能を提供します。
encrypt()
encryptWithManagedIV()
decrypt()
decryptWithManagedIv()
// 保護されたカスタム設定(例:PRIVATE_KEY__c)から暗号鍵を取得
PRIVATE_KEY__c privateKey = PRIVATE_KEY__c.getOrgDefaults();
Blob cryptoKey = EncodingUtil.base64Decode(privateKey.KEY1__c);

// 暗号化対象の平文
Blob data = Blob.valueOf('あいうえおカキクケコ');

// Salesforce より生成された初期化ベクトルと暗号鍵を使って平文を暗号化する
Blob encryptedData = Crypto.encryptWithManagedIV('AES256', cryptoKey, data);

// 暗号化された blob を復号する
Blob decryptedData = Crypto.decryptWithManagedIV('AES256', cryptoKey, encryptedData);

// Blob を string に割り当てる
String decryptedDataString = decryptedData.toString();

// あいうえおカキクケコ
System.debug('decryptedDataString : ' + decryptedDataString);
暗号化及び復号の例
秘密鍵をApexコードにハードコードしていけません。代わりに、保護されたカスタム設定(カスタム設定の [プライバシー] が [保護] に設定)に配置する必要があります。

デジタル署名の使用例

Apex Cryptoクラスは、sign()メソッドを使用してデジタル署名をサポートします。秘密鍵と公開鍵が必要なので、まずopenSSLを使って鍵を生成します。
Windows用OpenSSLのインストーラーは下記のサイトからダウンロードできます。
https://slproweb.com/products/Win32OpenSSL.html
1.秘密鍵「private-key.pem」を生成します
D:\dev>openssl genrsa 1024 > private-key.pem
Generating RSA private key, 1024 bit long modulus
...................+++++
......+++++
e is 65537 (0x010001)
秘密鍵生成
2.秘密鍵を使って公開鍵「public-key.pem」を生成します
D:\dev>openssl rsa -in private-key.pem -pubout -out public-key.pem
writing RSA key
公開鍵の生成
3.秘密鍵の形式を変換します
秘密鍵の値は EncodingUtilbase64Decode メソッドを使用して復号される必要があり、RSA の PKCS #8形式でなければなりません。下記のコマンドで秘密鍵の形式を「pkcs8」に変換します。
D:\dev>openssl pkcs8 -topk8 -nocrypt -in private-key.pem  -outform PEM > private-pkcs8.key
秘密鍵の形式変換
// RSAアルゴリズム
String algorithmName = 'RSA';

// private-pkcs8.key
String pkcs8Key = '********************';

// 秘密鍵の値を復号する
Blob privateKey = EncodingUtil.base64Decode(pkcs8Key);

// 電子署名対象
Blob input = Blob.valueOf('あいうえおカキクケコ’');

// デジタル署名を生成する
Blob signature = Crypto.sign(algorithmName, input, privateKey);

// public-key.pem
String pk = '***********************';
// 公開の値を復号する
Blob publicKey = EncodingUtil.base64Decode(pk);

// デジタル署名を検証する
Boolean verified = Crypto.verify(algorithmName, input, signature, publicKey);
System.assert(verified);
デジタル署名の生成と検証

終わりに

以上でApex Crypto クラスの構成と基本的な使い方を説明しました。如何でしたでしょうか。興味のある方はぜひ使ってみてください。
38 件
     
  • banner
  • banner

関連する記事