3

以下のクラスは、暗号化用のセキュリティ キー プロバイダーです。

public class MySecretKey {
private String key="2sfdsdf7787fgrtdfg#$%@cj5";
...
//Some Util methods goes on  Here .
}

最初は、ゲッターなしでデータにアクセスできるとは信じていませんでした private が、コンソールでキーを確認できるようになりました。

そして、リフレクションを使用する他の場所では、以下のようなコードを見ることができます:

public static void main(String[] args) throws Exception {
        Stacker myClass = new Stacker();
        Field key= myClass.getClass().getDeclaredField("key");
        field1.setAccessible(true);
        System.out.println(key.get(myClass));
    }

クラスの外からキーを隠すにはどうすればよいですか:(、privateリフレクションの場合、キーワードでも役に立ちません。

ヒントをください。

前もって感謝します。

4

4 に答える 4

1

Javaクラスで定義されたすべての文字列は、16進エディタでクラスファイルを開くことで簡単に検査できます。これらの文字列は、決して非表示にはなりません。言うまでもなく、先ほど発見したように、リフレクションを使用してプログラムで取得できます。

秘密鍵を「隠す」ために使用しているメカニズムは壊れており、完全に欠陥があります。代わりに、キーを外部ファイル(たとえば、シリアル化され暗号化されたキーストア)に保存し、他の手段(たとえば、パスワードや他の場所に保存されている別のキー)で保護する必要があります。

于 2013-02-15T21:26:25.463 に答える
1

setAccessible言う

まず、セキュリティマネージャが存在する場合、そのcheckPermissionメソッドがReflectPermission("suppressAccessChecks")権限を持って呼び出されます。

したがって、 suppressAccessChecks権限を拒否することでこれを防ぐことができます。

ただし、実際には、オブジェクトの不可侵性を維持するためにJVMに依存することは避けたほうがよいでしょう。 Joe-Eは、JVM内のクラス間の相互疑惑を許容しますが、JVMはそのために設計されていません。

于 2013-02-15T21:27:30.330 に答える
1

推奨される解決策は、キーをファイルに保存し、ファイル システムのアクセス許可を使用してファイルへのアクセスを制限することです。これは完全な解決策ではありません (確かにそれほど便利ではありません) が、コードにキーを配線するよりはましです。

于 2013-02-15T21:22:13.030 に答える