データを保護する必要があるプロジェクトに取り組んでいます (コードの公開は主な問題ではありません) ファイル。Java + Netbeans を使用しています。暗号化された形式で jar を作成する機能はありますか? また、データベースに sqlite を使用しているため、テキスト ファイルを暗号化形式にすることも適切なオプションではありません。
6 に答える
暗号化された JAR を作成することはできません。実行中の JavaVM は、実行したいデータを何らかの方法で読み取れる必要があるためです。VM と同様に、適切なツールとノウハウがあれば、誰でも JAR からすべてのデータを抽出できます。
JAR を暗号化できる場合は、暗号化の目的をまったく無効にする JAR を実行したいクライアントに、復号化キーまたは機能を提供する必要もあります。
あなたが得ることができる最良の方法は難読化ですが、それは野心的な攻撃者にとって本当のセキュリティまたはハードルではありません.
Kosi2801に同意します。クラス ファイルの暗号化はセキュリティの模倣にすぎません ( http://www.excelsior-usa.com/articles/java-obfuscators.htmlを参照) カスタム ClassLoader を使用すると、アプリケーション サーバーなどでアプリケーションが壊れる可能性があります。
より良い方法があります。クラス ファイルで文字列定数の暗号化を使用します。Allatori、Stringer Java Obfuscation Toolkit、Zelix KlassMaster、Smokescreen、DashO (超高価)など、ほとんどの市販の難読化ツールにはこの機能があります。Stringer Java Obfuscator には、コール コンテキスト チェック機能と完全性制御機能があり、保護をハッキングするのが非常に困難です。
最も安全な方法は、バイトコードの一部を JavaCard などの外部デバイスに保存して実行することです。
NB 私は Licel LLC の CEO です。Stringer Java Obfuscator の開発者。
Kosi2801 はほぼ正しいです。あなたができると私が考えることができる唯一のことは次のことですが、それは醜いです。
- 小さな標準 JAR と暗号化されたデータ ファイルを送信します。
- JAR が実行されると、暗号化されたデータ ファイルの一部がメモリに復号化されます (データが JAR 内にあるディレクトリのように、基本的にポインタ/長さのペアの単純なメモリ内ファイル システム)。
- 呼び出されたときに、JAR から適切な暗号化されたバイトを取得し (#2 で説明した疑似 FS テーブルを使用)、それを復号化し、そこからクラス データをロードする独自のクラス ローダーをセットアップします。
これにより、クラスをロードできます。同じことを (クラスローダーなしで) 実行して、他のリソースをロードできます。
実装するのは楽しいですが (チャレンジが好きな人にとっては)、これにはいくつかの問題があります。
- 暗号化を解除できる必要があるため、ユーザーは毎回パスワードを入力するか、それに類するものを入力する必要があります。JAR がそれ自体を復号化するのに十分な知識を持っている場合、誰でもそれを見て、復号化の方法を理解できます。これは、インターネット経由で既知の正常なサーバーに接続して復号化キーを要求することで軽減できます (そのプロセスを安全にしている限り)。もちろん、誰かがプログラムを実行したいときはいつでも、アクティブな「ネット接続」が必要です。
- すべてが記憶に残ります。(Cameron McKay が述べたように) 暗号化されたバイト コードのごく一部を処理するカスタム JVM がなければ、クラスはある時点で復号化されてメイン メモリに置かれることになります。他の人がそのメモリを読み取れないようにするために OS に依存しない限り、あなたはすでに、わずかな時間を手にした人との戦いに負けています。暗号化されたストアから読み出そうとするリソース (画像/フォント/など) についても同じ問題が発生します。
したがって、あなたは人々に逃げ道を与えて物事を難しくすることができますが、あなたが与えた状況では、他の人が投資しなければならない時間の価値がないようにすることしかできません.
特に、C/Assembly のように簡単に逆コンパイルでき、独自のコードを変更できない Java のようなものでは、ソフトウェアの保護は困難です。最も高価なソフトウェアの一部がハードウェア ドングルを必要としたり、特定の CPU やその他のハードウェアにロックされているのには理由があります。
一般に、アプリとそのデータを自己完結型にしたい場合、安全な方法でこれを行う方法はありません。ただし、ファイルを暗号化し、コードに埋め込まれたキーで解読することはできます。断固たるハッカーはそれを手に入れることができますが、それがあなたの心配事でなければ、問題ありません。これを行う場合、暗号化されたデータは圧縮できないことに注意してください。最初に圧縮してから暗号化してください。
データを安全に保つ必要がある場合 (機密データなど)、データをキーで暗号化し、そのキーをサムドライブに入れてアプリに渡すなどの外部手段でアプリに提供する必要があります。ユーザーは、安全な宅配便を使用します。
もう 1 つの可能性は、SSL 経由でデータ (またはキー) を利用できるようにし、適切な認証方法を使用してユーザーが誰であるかを確認することです。
一般に、どのシステムも完全に安全であることは不可能ですが、必須でもありません。システムは、システムをクラックしようとしていると思われる攻撃者を思いとどまらせるのに十分なだけ安全である必要があります。
もう 1 つのオプションは、JAR をオンザフライで復号化するカスタム JVM を作成することです。しかし、同じ問題が残ります。ある時点で、JAR Java クラスを JVM で実行するために復号化する必要があり、その時点でそれらをキャプチャして逆コンパイルすることができます。
言うまでもなく、カスタム JVM を使用すると、すべてのユーザーがその JVM もダウンロードする必要があります。
CipherOutputStream と CipherInputStream を使用して、Java オブジェクトを暗号化された形式でディスクにシリアル化できます。これは、データを保存するためのオプションです。