敏感データの暗号化と復号化
概要
APIリクエストを処理する際、特に敏感なデータ(例えばカード番号、CVV、有効期限など)を扱う場合、そのデータの安全性を確保する必要があります。これらの敏感なデータを保護するために、RSA
暗号化アルゴリズムを使用し、ECB
モードとOAEPPadding
パディング方式を組み合わせて暗号化を行います。
RSA暗号化
暗号化アルゴリズム
RSA/ECB/OAEPPadding
- RSA:非対称暗号化アルゴリズムで、公開鍵と秘密鍵を使用してデータを暗号化および復号化します。
- ECB(電子コードブックモード):暗号化モードで、各ブロックを独立して暗号化し、同じ長さの平文データブロックを暗号化するのに適しています。
- OAEPPadding:RSAアルゴリズムにおけるパディング方式で、追加のセキュリティを提供し、特定の攻撃から守ります。
暗号化と復号化のプロセス
- 鍵ペアの生成:
- RSA公開鍵と秘密鍵を生成します。公開鍵はデータの暗号化に使用し、秘密鍵は復号化に使用します。前回のドキュメント鍵ペアの生成を参考にして鍵を生成し、秘密鍵は安全に保管し、公開鍵はCodePayプラットフォームにアップロードしてください。
- RSA暗号化を使用するには、CodePayの公開鍵を使用するだけでよいため、鍵の生成は不要です。CodePayから返される敏感データを復号化する必要がある場合にのみ、秘密鍵を使用します。現在のビジネスシナリオでは、開発者に敏感なデータが返されることはないため、このステップは無視しても問題ありません。
- 敏感データの暗号化:
- RSA公開鍵を使用して敏感データを暗号化します。APIを使用するシナリオでは、CodePayの公開鍵
GATEWAY_RSA_PUBLIC_KEY
を使用してデータを暗号化してください。 - 暗号化の際、ECBモードとOAEPPaddingパディング方式を使用します。
- 暗号化されたデータの送信:
- 暗号化されたバイト配列をBase64文字列にエンコードし、ネットワークを介して転送できるようにします。暗号化されたデータはAPIを通じて送信します。
- データの復号化:
- 受信者は暗号化された文字列をBase64デコードした後、RSA秘密鍵を使用して暗号化されたデータを復号化します。
- 復号化時には、同じパディング方式(OAEPPadding)を使用します。
CodePayから返されたメッセージやWebhook通知メッセージのデータに暗号化されたデータが含まれている場合は、同様の方法で秘密鍵 APP_RSA_PRIVATE_KEY
を使用して復号化してください。
注意事項
- 鍵の管理:公開鍵と秘密鍵の安全な管理を行い、秘密鍵を不正アクセス者に漏らさないようにしてください。
- データのセキュリティ:暗号化前のデータは機密性を保持し、転送中に平文データが漏れないようにします。
- コンプライアンス:適用される規制や基準(例えばPCI-DSS)に従って、敏感データを取り扱ってください。
よくある質問
- 同じ平文をRSAで暗号化すると、なぜ毎回結果が異なるのですか?
RSA暗号化で同じ平文を暗号化しても結果が異なるのは、ランダムパディング機構が使用されているためです。これはRSA暗号化の重要な特徴で、暗号化のセキュリティを強化し、暗号化モード攻撃を防止するためです。
- ランダムパディング:暗号化の際、パディングアルゴリズム(例えばOAEP)は新しいランダムデータを生成します。このランダムデータは平文データと一緒に暗号化されるため、平文が同じであっても、ランダムパディングの違いにより暗号化結果が異なります。
- 再送攻撃の防止:ランダムパディング機構により、RSA暗号化は同じ暗号化操作で同じ暗号文を生成しないため、再送攻撃などの攻撃を防ぐことができます。
そのため、暗号化後に復号化が成功すれば、暗号化プロセスは正しいと見なされます。
参考文献
サンプルコード
以下はJava SDKを使用したサンプルコードで、RSAを使った暗号化の方法を示しています。完全なコードはJava SDKを参考にしてください。

AES暗号化
**AES(高度な暗号化標準)**は、データ保護分野で広く使用される対称暗号化アルゴリズムです。RSAアルゴリズムとは異なり、AESは同じ鍵を使用してデータを暗号化および復号化し、高速で強力な暗号化能力を持っています。
暗号化アルゴリズム
-
AES/ECB/PKCS5Padding
-
AES:対称暗号化アルゴリズムで、固定サイズ(128ビット)の鍵を使用してデータを暗号化および復号化します。AESアルゴリズムは128ビット、192ビット、256ビットの鍵長をサポートしています。
-
ECB(電子コードブックモード):入力データを固定サイズのブロック(通常128ビット)に分け、それぞれのブロックを独立して暗号化する一般的な暗号化モードです。ECBモードは暗号化操作が簡単ですが、特定の攻撃(例えば、モード分析攻撃)に弱いため、いくつかのアプリケーションシナリオでは使用を避けることが推奨されます。
-
PKCS5Padding:データブロックがアルゴリズムの要件を満たすようにするパディング方式で、データブロックの長さが不足している場合、適切な長さになるようにPKCS5Paddingを追加します。PKCS5Paddingは対称暗号化アルゴリズムに適しており、各暗号化ブロックが完全であることを保証します。
暗号化と復号化のプロセス
-
鍵の生成:適切な鍵長(例えば128ビット、192ビット、256ビット)を選択します。鍵生成プロセスは、その安全性を確保し、不正アクセス者に取得されないようにする必要があります。
-
敏感データの暗号化: 選択した鍵を使用して敏感データをAESで暗号化します。暗号化時には、ECBモードを使用してデータブロックを独立して暗号化し、PKCS5Paddingパディング方式を使用してデータブロック長が要求に合致するようにします。
-
暗号化されたデータの送信: 暗号化されたデータをバイト配列としてエンコードし(通常はBase64エンコード)、ネットワーク経由で転送します。エンコードされた暗号化データはAPIのレスポンスとしてクライアントに返されます。
-
データの復号化: 受信者は暗号化されたデータを受け取った後、まずBase64エンコードされたデータをデコードします。その後、同じAES鍵とパディング方式(PKCS5Padding)を使用して復号化操作を行い、元の平文データを復元します。
注意事項
- 鍵管理:AES鍵の安全な保管と管理を行い、鍵が漏洩しないようにします。安全な鍵管理システムを使用して鍵を保護することをお勧めします。
- パディング方式:PKCS5Paddingパディング方式はデータ長が不足している場合に適用されますが、特定の長さ要件がある場合は他のパディング方式(例えばPKCS7)を選択する必要がある場合もあります。
- ECBモードの制限:ECBモードはシンプルで使いやすいですが、追加のランダム化を導入しないため、特定の攻撃を受けやすいです。そのため、高度に敏感なデータが関わるシナリオでは、通常は他のモード(例えばCBCモード)の使用が推奨されます。
よくある質問
-
なぜAES暗号化後の暗号文が毎回異なるのですか? AES暗号化では、特定のモード(例えばCBCモード)を使用する際にランダム化処理が行われますが、ECBモードにはその特性がありません。そのため、毎回同じ入力データを暗号化しても、結果の暗号文が同じであることがあります。これはパディング方式や他の暗号化パラメータに起因する場合があります。ECBモードでは、同じ入力データに対して常に同じ暗号文が生成されるため、特定のセキュリティ問題が生じる可能性があります。したがって、特定のアプリケーションシナリオでは、ECBモードの使用を避けることが推奨されます。
-
AES暗号化のセキュリティをどう強化できますか? AESアルゴリズム自体は非常に安全ですが、ECBモードを使用する場合、暗号化データのパターンが単純であり、攻撃を受けやすい可能性があります。したがって、より安全な暗号化モード(例えばCBCモードやGCMモード)を使用し、適切なランダム化戦略(例えばIV初期化ベクトル)を組み合わせて暗号化のセキュリティを強化することをお勧めします。
参考文献
- AES暗号化
- [電子コードブック(ECB)モード](https://en.wikipedia.org/wiki/Block
- 電子コードブック(ECB)モード
- PKCS5 Padding
サンプルコード
以下はJava SDKを使用したサンプルコードで、AESを使った暗号化の方法を示しています。完全なコードはJava SDKを参考にしてください。
