web-dev-qa-db-ja.com

コードで秘密鍵をどのように非表示にしますか?

一部のソフトウェアが秘密鍵を簡単に発見できないような方法でどのように非表示にするのか、しばらく疑問に思っていました。ほんのいくつかの例:

  • DVDプレーヤーソフトウェアがCSSキーを非表示にする
  • シリアル番号/登録コードを備えたソフトウェアは、シリアル番号の検証に使用されるキー/ハッシュを隠します

明らかに、これらのプログラムは、バイト[]にキーを含めるだけではなく、キーを盗んだり、独自のシリアル番号を生成したりするなどの機能を備えています。

これらのキーを簡単に見つけられないように非表示にするために、どのような戦略が使用されていますか?

45
TTar

これらの秘密鍵が非常に簡単に発見された理由は、それらがソフトウェアに隠されていたためです。

ソフトウェアの秘密を絶対に隠すことは避けてください。難読化すると、今のところあなただけのものになります。これを自問してみてください。逆アセンブリ、ユーザーモード、カーネルモードデバッガーへのフルアクセスがあり、日帰りの仕事がないユーザーから、ソフトウェアのキーをどのように隠すことができますか?ひびが入るのは時間の問題です。

37
Michael

キーをどこかに隠し、必要なときに解読するだけです。 「安全に」キーを使用することは複雑な部分です。クラッカーは、復号化されたキーを使用してダンプする場所にブレークポイントを設定する可能性があります。彼らはあなたのコードをスキャンして、あなたが既知の暗号アルゴリズムを使用していることを示すパターンを見つけるかもしれません(ほとんどのアルゴリズムは事前に計算されたテーブルを持っています)。などなど.

そのため、ソフトウェア全体を実行可能にして分析を困難にする必要があります。これには、実行可能パッカー、仮想マシンでのコードの実行、整合性チェックなどを使用します。これはすべて、コードのデバッグと変更を遅くするためです。

ここにいるほとんどの人があなたは誰も止めることはできないと指摘しているので、ただ彼らを遅くしてください。私はクラッカーフォーラムに行って、そこに主要な隠蔽問題についての提案を求めます。きちんと尋ねれば、それらはおそらく役立つでしょう。

ps。公開鍵暗号は鍵を隠蔽しませんが、ライセンススキームを実行している場合、鍵ジェネレータを作成するのが難しく(または理論的に不可能)になる可能性があります。

13
John Smith

一番下の行は、することはできません。理由については、他のコメントをご覧ください。 PGP/GPGのような暗号化ソフトウェアでさえ、キーをファイルに保存し、それらのファイルを安全にフラッシュドライブに保存するよう強く要請します。実行可能コードの一部として保存されているキーが検出されます。

実際、通常の操作の一部としてクライアントによって復号化されるものをクライアントマシン上で暗号化しようとしている場合も、それはばか者の用事です。クライアントマシンは本質的に安全ではなく、クライアントマシンがデータに対して実行できることを制御することはできません。

認証しようとしている場合は、代わりに、サーバーへのログインを使用したインターネットベースの認証、またはソフトウェアの検証に使用される生成されたある種のKeyCodeを確認してください。

公開鍵と秘密鍵のペアの一部としての秘密鍵は、保護可能なデータファイルに保存する必要があります。対称キーは、セッションキーとしてその場で生成され、破棄されます。コンピュータにシークレットキーまたはセッションキーを持っている人はだれでもそれを発見でき、意図に反して使用できると常に想定しています。

詳細については、Bruce Schneierによる " Applied Cryptography "を参照してください。

6
Furious Coder

キーを永久に隠すことはできません。しかし、あなたはそれを見つけにくくすることができます。いくつかのアプローチは、メモリ内のキーを暗号化する、相互にチェックされる複数のコピー(おそらく異なる方法で暗号化される)を保持する、アクセスするダミーコピーを残す、奇妙な形式でキーを保存する、などです。はあなたの鍵を望んでいますが、少なくともカジュアルで経験の浅い攻撃者を思いとどまらせることができます。

5
Promit

ライセンスを検証するために常にキーが必要なわけではありません。

しかし、その事実を無視して、あなたの鍵は別の機能の結果である可能性もあります。実際には特定のキー値を保存するのではなく、キーを即座に生成する関数を持っています(常に同じ結果)。不可能ではありませんが、値を探す必要がなくなるため、見つけるのは非常に難しくなりますが、それが方程式であることを理解する必要があります。

1

ソフトウェアの開発を開始したときに、日付付きのライセンスファイルを作成しました。その後、私たちのソフトウェアの購入に興味を持っている人はそれほど多くないことに気づきました。その後、無料で提供することにしました。より多くの人々が少なくとも私たちの傑作を試して気にかけ始めました。最後に、ソフトウェアをオープンソース化しました。より多くのユーザーがそれを使い始めました。これらのユーザーのごく一部が有料の顧客になることを期待しています(つまり、製品サポートの購入またはカスタマイズの要求)。

肝心なのは、誰かがあなたのソフトウェアを解読したいのなら、彼/彼女はとにかくそれをするでしょう。この隠された秘密鍵でそれを保護しようとするあなたの時間を無駄にすることは本当に価値がありますか?

1
Yakov Fain

余裕がある場合は、秘密鍵を暗号化USBトークンに保存するのが最善です。キーは書き込み専用です。つまり、設定はできますが読み取りはできません。トークンは、ハードウェアの内部で暗号化操作を実行します。キーを取得するのは非常に複雑になります(トークンに既知の脆弱性がない場合、これは古いものには当てはまりません)。

1
galinette

コードで秘密鍵を隠すことは本当に安全ではありません。お気づきかもしれませんが、DVDとほとんどのソフトウェアシリアル番号の登録は毎日ハッキングされています。本当に何かを保護したい場合は、公開鍵暗号化を使用する必要があります。

0
Adam Berent

できません、それは不可能です。ターゲットマシンにアクセスできる攻撃者は、コードを逆アセンブルしてコードを見つけたり、ターゲットマシン上のキーファイルを見つけたりすることができます。

暗号化キーが安全であることを確認する唯一の方法は、必要なときにユーザーが手動で入力することです。

0
FNG