web-dev-qa-db-ja.com

暗号化されたJarファイルを作成するにはどうすればよいですか?

私はデータ(コードの公開は主な問題ではありません)ファイルを保護する必要があるプロジェクトに取り組んでいます。 Java + Netbeansを使用しています。暗号化された形式でjarを作成する機能はありますか?データベースにもsqliteを使用しています-したがって、暗号化された形式でテキストファイルを配置することも適切なオプションではありません。

17
Kartik Mistry

実行中のJavaVMは、実行したいデータを何らかの方法で読み取れる必要があるため、暗号化されたJARを作成することはできません。また、a VM)と同様に、適切なツールとノウハウを持っている人なら誰でも、JARからすべてのデータを抽出することができます。

JARを暗号化できる場合は、暗号化の目的をまったく無効にするJARを実行するクライアントに復号化キーまたは機能を提供する必要もあります。

あなたが得ることができる最善のものは難読化ですが、それは野心的な攻撃者にとって本当のセキュリティやハードルではありません。

22
Kosi2801

Kosi2801に同意します。クラスファイルの暗号化はセキュリティの模倣にすぎません( http://www.excelsior-usa.com/articles/Java-obfuscators.html を参照)カスタムClassLoaderを使用すると、アプリケーションが破損する可能性があります。アプリケーションサーバーで。

より良い方法があります:クラスファイルで文字列定数の暗号化を使用します。ほとんどの商用難読化ツールにはこの機能があります。たとえば、 AllatoriStringer Java Obfuscation ToolkitZelix KlassMasterSmokescreenDashO (超高額)。StringerJava Obfuscatorには呼び出しコンテキストチェックと完全性制御機能は、保護をハッキングするのを非常に困難にします。

最も安全な方法は、JavaCardなどの外部デバイスにバイトコードの一部を保存して実行することです。

N.B.私はLicelLLCのCEOです。ストリンガーの開発者Java難読化ツール。

9
Ivan Kinash

Kosi2801はほぼ正しいです。私があなたにできると思う唯一のことは次のことですが、それは醜いです。

  1. 小さな標準JARと暗号化されたデータファイルを出荷します。
  2. JARが実行されると、暗号化されたデータファイルの(一部)がメモリに復号化されます(データがJAR内にあるディレクトリなど、基本的にはポインタと長さのペアの単純なメモリ内ファイルシステム)。
  3. 呼び出されると、JARから適切な暗号化バイトを取得し(#2で説明した疑似FSテーブルを使用)、それを復号化して、そこからクラスデータをロードする独自のクラスローダーを設定します

これにより、クラスをロードできます。同じことを(クラスローダーなしで)実行して、他のリソースをロードすることもできます。

実装するのは楽しいですが(チャレンジが好きな人のために)、これにはいくつかの問題があります:

  1. 内容を復号化できる必要があるため、ユーザーは毎回パスワードを入力するか、同様のことを行う必要があります。 JARがそれ自体を復号化するのに十分な知識を持っている場合、誰でもそれを見て、物事を復号化する方法を理解できます。これは、インターネット経由で正常なサーバーに接続して復号化キーを要求することで軽減できます(そのプロセスを安全にする限り)。もちろん、これには、誰かがプログラムを実行したいときはいつでも、アクティブなネット接続が必要です。
  2. すべてがメモリに格納されます。暗号化されたバイトコードのごく一部を処理するカスタムJVMがないと(Cameron McKayが述べたように)、クラスはある時点でメインメモリにある状態で復号化されてしまいます。他の人がそのメモリを読み取れないようにするためにOSに依存しない限り、あなたはすでに少しの時間を持っている人との戦いに負けています。暗号化されたストアから読み取ろうとするリソース(画像/フォントなど)の同じ問題。

だからあなたは人々に回り道を与えて物事を難しくすることができます、しかしあなたがあなたがすることができるすべてを与えた状況ではそれを他の人が投資しなければならない時間の価値がないようにすることです。

ソフトウェアの保護は、特にJavaのように、簡単に逆コンパイルでき、C/Assemblyのように独自のコードを変更できない場合は、困難です。最も高価なソフトウェアのいくつかには理由があります。ハードウェアドングルが必要であるか、特定のCPUまたは他のハードウェアにロックされています。

8
MBCook

一般に、アプリとそのデータを自己完結型にする場合、これを安全な方法で行う方法はありません。ただし、確かにファイルを暗号化し、コードに埋め込まれたキーを使用してファイルを記述できます。断固としたハッカーはそれを手に入れることができますが、それがあなたが心配していることではない場合は、問題ありません。これを行う場合、暗号化されたデータは圧縮できないため、最初に圧縮してから暗号化することに注意してください。

データを本当に安全にする必要がある場合(機密データなど)、キーを使用してデータを暗号化し、そのキーをアプリに提供する必要があります。たとえば、サムドライブにデータを配置して、安全な宅配便によるユーザー。

もう1つの可能性は、SSLを介してデータ(またはキー)を利用できるようにし、適切な認証方法を使用してユーザーが誰であるかを確認することです。

一般的に、どのシステムも完全に安全であるということは不可能ですが、それは必須ではありません。システムは、攻撃者がシステムをクラックしようとしていると思われることを思いとどまらせるのに十分なだけ安全である必要があります。

3
paulmurray

もう1つのオプションは、JARをその場で復号化するカスタムJVMを作成することです。ただし、同じ問題が残ります。ある時点で、JAR JavaクラスをJVMで実行するために復号化する必要があり、その時点で、クラスをキャプチャして逆コンパイルできます。

言うまでもなく、カスタムJVMを使用すると、すべてのユーザーがそのJVMもダウンロードする必要があります。

2
cdmckay

CipherOutputStreamとCipherInputStreamを使用して、Javaオブジェクトを暗号化された形式でディスクにシリアル化できます。これは、データを保存するために開いているオプションです。

1
Martin OConnor