シナリオ
我々は、Javaのフロントエンドと実装より複雑な数学的アルゴリズムC ++側を使用するアプリケーションを開発しています。この目的のためのJavaがあるnative
機能は、アクセスC ++のJavaを経由して機能を、JNI経由で実装されています。
問題
歴史的に、我々は、後者は無視することができ、ほぼすべてのそれのJava側、比較的大きなコードベースを中心に、アプリケーション固有の設定ファイルでは、いくつかの設定可能な資格情報を飛んでより多くの資格証明書の問題だったWRTこの質問の範囲を。
私たちは、アプリケーションのセキュリティを強化したいと思います。私たちが直面している問題は、それがアプリケーションに配信されます、我々は我々のデータを復号化するために使用しますので、どんな秘密鍵、私たちのアプリケーションをオフラインで実行することができなければならないということです。私たちは、私たちの選択肢を検討しているが、それらのどれもが少なくともビット安全なように見えるん:
- パスワードJava側と利用ください
crypto
パッケージを-まだ、暗号化アルゴリズムを識別することができ、これは、比較的容易に解読することができるので、必須で暗号化するためのパスワードはまだ、公然とどこかに保存すること。また、JARは比較的よくアクセスできます。 - パスワードC ++側を維持し、機能を使用して
decryptKey
、プレーン、それを返し、その後、秘密鍵でそれがC ++側復号化、それにパスワードを渡すことによって。それだけで、あなた自身のJARを構築し、当社のDLLが含まれ、その後、ネイティブアクセスするために、容易に考えられるので、この場合はJNIは、脆弱性となりdecryptKey
、プレーンテキストのパスワードを取得するための関数を。 - C ++のすべてのキーに依存するロジックをシフトします。我々はそれが属していないシフトロジックに持ってしまうので、これは、ほとんど意味がありません。さらに、いくつかの実装では、これは悲しげにオプションではありませんので、必要性が、資格証明書を供給すべきことを、サードパーティのJava APIが必要です。
質問
おそらくこれは、業界では珍しい問題ではありませんので、これを処理する最も賢明な方法は何ですか?現在、これらはのみ紹介近づい不明瞭でセキュリティを、の有効性は、最良の議論の余地のとほとんどゼロ以上の最悪です。これは業界でどのように扱われるかが標準的な手順はありますか?
まず、あなたの製品が安全にあなたの秘密鍵を保つことができる製品と統合できるようにする必要があります。これらの製品は、TPM、HSMとKMSを。これはextermelyローカルとクラウドベースのprduction環境向けusefult証明します。
第二に、あなたが実装する必要があり、エンベロープの暗号化データ暗号化キーはTPM / HSM / KMSに保存されますマスターキーで暗号化されたメカニズムを、。暗号化されたデータの暗号化キーは、データを保存することができます。
第三に、あなたが実装する必要があり、キーローテーションあなたはしばらく一度のマスター/データキーを置き換えます、。
第四に、そして最後に、あなたは相談するべき情報セキュリティの将来の硬化の質問ではなく、StackOverflowのを。