進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

カスタムアプリケーションでの暗号化の使用

学習の目的

この単元を完了すると、次のことができるようになります。

  • Apex Crypto クラスについて説明する。
  • Apex Crypto クラスおよびカスタム暗号化のさまざまな使用事例を説明する。
  • 学習したことを応用して独自のアプリケーションで暗号化を実装する。

Apex Crypto クラスとは?

Salesforce アプリケーションでの暗号化の実装について言えば、Apex にはカスタム暗号化関数を記述する柔軟性があり、事前に作成済みの幅広い関数を活用できます。この単元では、Apex Crypto クラスを使用して、ダイジェスト、メッセージ認証コード (MAC)、署名、暗号化/復号化関数を作成するために提供されている Salesforce の強力な関数を見ていきます。

Crypto クラスには、通信が傍受されるのを防ぎ、データの整合性を確保するために特に役立つ関数一式が用意されています。これらの関数を使用して、傍受者から機密データを効果的に防御し、メッセージデータが完全で変更されていないことと、送信者および受信者の信頼性を確認できます。これらの各関数では、さまざまなアルゴリズムがサポートされるので、ソリューションの構成を適度に制御できるとともに、アプリケーションを保護するために必要な追加作業を最小限に抑えることができます。

暗号化と復号化による機密性の保護 

暗号化と復号化は、AES128、AES192、AES256 の各アルゴリズムをサポートする Apex Crypto.Encrypt() 関数と Crypto.Decrypt() 関数を使用して、簡単かつ柔軟に処理できます。暗号化関数と復号化関数は、アプリケーションデータの機密性を確保するために必要です。独自の暗号化鍵を生成するか、Crypto.generateAESKey(Integer keylength) メソッドを使用できます。暗号化鍵を保護するには、前の単元で練習した、保護されたカスタムメタデータ型または保護されたカスタム設定に秘密を保存する手法を使用できます。

整合性を守るハッシュダイジェスト

データの整合性を確認するのに便利なもう 1 つの関数は、Apex Crypto.generateDigest() 関数です。このメソッドは、一方向のハッシュダイジェストを生成し、MD5、SHA1、SHA256、SHA512 などのアルゴリズムをサポートします。これらのハッシュダイジェストは、偶発的なデータ破損 (またはその他の望ましくない変更) を特定するのに役立ちます。データの再計算されたダイジェストは元のダイジェストと一致しないので、ハッシュダイジェストの比較チェックを行うと、データが改変されたことを確認でき、データの変更をすばやく検出できます。これによって、データ破損、偶発的変更、悪意のある改変といったイベントへの注意が促されます。

ハッシングアルゴリズムには、さまざまなセキュリティ強度があります。MD5 は Crypto クラスによってサポートされますが、弱いハッシングアルゴリズムと見なされているため、ハッシュダイジェストの計算には SHA1 以上を使用することをお勧めします。

信頼性と整合性を証明するハッシュベースのメッセージ認証コード (MAC)

もう 1 つ便利な関数に、メッセージ認証コード (MAC) を作成するのに使用できる Apex Crypto.generateMac() 関数があります。MAC をメッセージダイジェスト関数と一緒に使用して、ハッシュ化された MAC (HMAC) を設定できます。HMAC は、メッセージの送信者を認証し、メッセージが伝送中に変更 (または傍受) されないように、TLS および IPSec の両方のプロトコルで使用されます。

Crypto.generateMac() メソッドは、HMACMD5、HMACSHA1、HMACSHA256、HMAC512 の各アルゴリズムをサポートします。HMAC 関数では、メッセージダイジェスト、および送信者と受信者が MAC の暗号化と復号化に使用する非公開鍵を使用する必要があります。受信者は共有の非公開鍵を使用して MAC を復号化する必要があるので、メッセージ送信者の信頼性を確認できます。その後、メッセージダイジェストを比較して、受信者はメッセージが伝送中に (中間者攻撃により) 変更されなかったことを確認できます。

デジタル署名の作成

デジタル署名を生成するには、Crypto.sign() 関数を使用できます。この関数は SHA1 アルゴリズムを使用してダイジェストを作成します。その後、ダイジェストは RSA を使用して非公開鍵で暗号化されます。デジタル署名は、メッセージの整合性と信頼性の両方を保証します。この設定では、メッセージ受信者が公開鍵を使用して (送信者の非公開鍵で暗号化された) メッセージを復号化でき、次に送信されたメッセージダイジェストと、受信したメッセージから生成されたダイジェストを比較して、受信者がその整合性を確認できます。

Apex Crypto の使用

Apex Crypto クラスの関数について説明したので、次は実際に使用してみましょう。

  1. Kingdom Management 開発者組織にログインします。

  2. アプリケーションピッカーから [Secret Storage (ストレージを選択)] を選択します。

  3. [Apex Encryption Demo (Apex 暗号化デモ)] タブをクリックします。現在このデモでは、王国間で王家の長がクリアテキストの暗号化されていないメッセージを送信しています。このデモの目標は、王国同士で安全にメッセージのやり取りができるように、Apex Crypto クラスの関数を使用してカスタム暗号化を実装することです。メッセージを受信する王国は、[Decrypt Message (メッセージを復号化)] をクリックしてメッセージを復号化できます。最新のメッセージは常に上部に表示されます。

    use-encryption-in-custom-applications

  4. ページ下部にある [Apex Controller (Apex コントローラ)] リンクをクリックするとコードが表示されます。

  5. どうやら王国の開発者が暗号化を正しく実装しなかったようです。現在、メッセージはクリアテキスト (非暗号化形式) で表示されています。これを変更し、メッセージに暗号化を実装して、暗号化鍵にアクセスできるユーザのみがメッセージを復号化できるようにします。データベースにメッセージを保存する Save() 関数コードを次に示します。

     public PageReference Save(){ 
     if (!Schema.sObjectType.Encrypt_DecryptC__c.fields.Name.isCreateable()){
       return NULL; 
       } try { 
        if(pitemName != NULL && pitemName != '') { 
         if(encrypt.Name.length < 80) { 
          //Add code here
          
           insert encrypt; 
           encrypt.id = null; 
           getMessage();
           } 
          } } catch (Exception e){ 
          ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severrity.FATAL, 'Empty string or handling an error!'); 
          ApexPages.addMessage(myMsg); 
         } 
         return NULL; 
        } 
        
  6. クラスを変更し、機能を追加して、メッセージを暗号化してみましょう。Save() という関数を検索し、AES128 (本番環境では AES256 を推奨) 暗号化を実装します。Apex Crypto クラスから encryptWithManagedIV 関数を使用します。最終的なコードは次のようになります。

     public PageReference Save(){ 
      if (!Schema.sObjectType.EnCrypt_DecryptC__c.fields.Name.isCreateable()) { 
        return NULL; 
          } try { 
            if(pitemName != NULL && pitemName != ''){ 
              if(encrypt.Name.length() < 80) { 
              Blob data = Blob.valueOf(encrypt.Name); 
              Blob encryptedData = Crypto.encryptWithManagedIV('AES128', cryptoKey, data ); 
              String b64Data = EncodingUtil.base64Encode(encryptedData); 
              encrypt.name = b64Data; 
              insert encrypt;encrypt.id = null; 
              getMessages(); 
            } 
          } } catch (Exception e){ 
          ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.FATAL, 'String empty or handling an error!'); 
          ApexPages.addMessage(myMsg); 
        } 
      return null; 
      } 
    

  7. ここまでで、Save function() を変更できました。これはメッセージを暗号化して保存するために使用します。次は、復号化関数を変更して、メッセージを正しく復号化します。同じクラスで、DecryptMe() という関数を検索し、cryptokey を指定した Crypto.decryptWithManagedIV() メソッドを使用して、メッセージを復号化し、プレーンテキストで表示します。最終的なコードは次のようになります。

     public PageReference DecryptMe(){ 
      if(pitemName != NULL && pitemName != ''){ 
       Blob data = EncodingUtil.base64Decode(pitemName); 
       Blob decryptedData = Crypto.decryptWithManagedIV('AES128', cryptoKey, data); 
       String dryptData = decryptedData.toString(); 
       paramValue = dryptData; 
      } else { 
       System.debug('PitemName was NULL '); 
      } 
     return null; 
    } 

  8. これまでの手順に従い、組織でコードを変更した場合は、既存のメッセージを削除し、王国間で新しいメッセージをいくつか送信してみてください。AES128 (本番環境では AES256 を推奨) 暗号化を実装したので、メッセージは暗号化されるようになりました。これらのメッセージは正しい暗号化鍵でしか復号化できないので、ライバルの王国はメッセージを傍受できません。この暗号化鍵は、保護されたカスタムメタデータ項目または設定に安全に保存します。

これで終了です。王国はこのアプリケーションを使用して、他の王国へ暗号化メッセージを安全に送信できます。

結論

最初の単元では、アプリケーションの秘密の基本、および秘密を安全に保存することの重要性について確認しました。単元 2 と 3 では、Salesforce プラットフォームを効果的に使用して、これらの秘密を保護する方法について学びました。安全な通信を実装するために使用できる Apex Crypto クラスで提供される強力な関数について説明しました。また、保護されたカスタム設定および保護されたカスタムメタデータ項目を使用して、アプリケーションの秘密 (暗号化鍵など) を安全に保存する方法についても学びました。これらの単元で練習した手法とメソッドを並行して使用すると、無防備な王国を頑強な要塞にする、強力なセキュリティソリューションとなります。

リソース

Apex 開発者ガイド: Crypto クラス