3

コンパイルされたJavaファイル内の文字列を暗号化できるかどうか知りたいのですが。たとえば、対称鍵を使用してzipファイルをデコードする必要があり、その鍵をJavaクラスのプライベート定数に格納する必要があります。

private static final String ZIP_PASSW="secret"

しかし、単純な逆バイトコードに生のパスワードが表示されることは望ましくありません...それを回避するための何かが存在すると思いますか?

ありがとうございました

PS:なぜSOが私の質問がこのPSなしではその基準を満たさないと言ったのか理解できません

4

6 に答える 6

4

実際のハッカーは引き続きパスワードを復号化できますが、パスワードを文字列リテラルとして保存しないと、少し難しくなる可能性があります。あなたが使用することができます:

private static final String KEY = new String(new char[]{'s', 'e', 'c', 'r', 'e', 't'});

これにより、バイトコードが生成されます。

javap -c -v TestObfuscate

static {};
  Code:
   Stack=6, Locals=0, Args_size=0
   0:   new #10; //class java/lang/String
   3:   dup
   4:   bipush  6
   6:   newarray char
   8:   dup
   9:   iconst_0
   10:  bipush  115
   12:  castore
   13:  dup
   14:  iconst_1
   15:  bipush  101
   17:  castore
   18:  dup
   19:  iconst_2
   20:  bipush  99
   22:  castore
   23:  dup
   24:  iconst_3
   25:  bipush  114
   27:  castore
   28:  dup
   29:  iconst_4
   30:  bipush  101
   32:  castore
   33:  dup
   34:  iconst_5
   35:  bipush  116
   37:  castore
   38:  invokespecial   #12; //Method java/lang/String."<init>":([C)V
   41:  putstatic   #16; //Field KEY:Ljava/lang/String;
   44:  return

一方

private static final String ZIP_PASSW="secret"

戻り値

Constant pool:
const #8 = String   #9; //  secret

PASSWORD定数またはを呼び出さなかったことに注意してくださいZIP_PASSW(文字列がパブリックの場合、これは重要です)。

代わりに、またはそれに加えて、 ProGuardなどの難読化ツールを使用できます。

于 2012-06-11T15:22:23.307 に答える
3

キーをコードに保存すると、リバースエンジニアリングによっていつでも取得できます。また、コンパイル前またはコンパイル後にキーを保存するかどうかは関係ありません。

プログラムをリバースエンジニアリングする可能性がなければ、プログラムであらゆる種類の(暗号化されていない)キーを配信する方法はありません。そのため、最初に非対称暗号化が発明されました。

したがって、対称暗号化の使用を主張する場合は、アプリケーションの外部(たとえば、テキストファイル)にキーを保存し、プログラムのユーザーに安全なチャネルでファイルを配信する必要があります。(もちろん、誰が好きなようにキーを使用できます)。

それがあなたが望むものでない場合は、非対称暗号化技術を調べる必要があります。

于 2012-06-11T15:23:22.500 に答える
2

対称鍵を使用してzipファイルをデコードする必要があると言うとき、それは間違いなくあなたがする必要があることですか?パスワードをプレーンテキストとして保存する方法や、パスワードをエンコードする方法などの詳細を考えるのではなく、アーキテクチャ全体を調べる必要があるかもしれません。たとえば、コードがキーを保存するのではなく、セキュリティで保護されたWebサービスを呼び出してキーを取得できる可能性がありますか?明らかに、あなたが何を目指しているのかをよりよく理解しなければ、実行可能な代替案を提案することは困難ですが、あなたが説明していることは、適切に安全に保つのが難しいでしょう-隠すことによって安全になりますが、強くはありませんあなたの鍵を見つけようと決心した誰かに対して。

それがあなたがする必要があることに対して十分に安全でない場合、最も標準的な応答はおそらく対称暗号化を使用するのではなく、ある種のPGP鍵交換を統合することでしょう。

于 2012-06-11T15:16:18.927 に答える
1

最善の方法は、アクセスを少し難しくすることです。暗号化された文字列は、コードに保存されているパスワードを使用して復号化できます。パスワードを隠すための対策を講じることはできますが、プライベート定数を使用することはそのような対策の1つではありません。

于 2012-06-11T15:16:45.653 に答える
0

暗号化済みのパスワードを保存してみませんか?

于 2012-06-11T15:07:13.260 に答える
0

いいえ、暗号化されたパスワードを保存する場合でも、ある時点で復号化する必要があります。クラッカーはコードを分解してアルゴリズムを理解し、そこからパスワードを取得できます。

于 2012-06-11T15:09:32.027 に答える