3

ですから、最初に、これらのことは決して絶対確実ではなく、十分な努力が払われれば何かが壊れる可能性があることを私は知っていることを指摘したいと思います。

しかし:私が誰か(私が書いたもの)にソフトウェアを渡して、彼らにそれを実行させるとしましょう。彼らが得た結果を検証したいと思います。私は、彼らがそれを実行し、満足のいく結果を得たことを確認するために使用できるある種の暗号化/ハッシュを使用することを考えていました。

また、結果が「偽物」になることも望んでいません(ただし、それを破るのに十分な努力が払われれば、それなどが適用されることはわかっています...)。したがって、ハッシュを使用する場合、「はい」のハッシュと「いいえ」のハッシュだけを使用することはできません(これは、ハッシュが2つのオプションのうちの1つにすぎないことを意味します-簡単に偽造可能です)。

ツールのユーザーに、可能な限り小さいもの(たとえば、電子メールなど)を返送してもらいたい(たとえば、ログの行や行をトロールしたくない)。

これをどのように実装しますか?私はおそらく物事を最もよく説明していませんが、うまくいけば、あなたは私がやりたいことの要点を理解するでしょう。

誰かが以前にこの種のことを実装したことがあるなら、どんなポインタでも大歓迎です。

この質問は、特にコードについて質問するのではなく、「実装方法」に関するものです。重要なタグを見逃した場合は、遠慮なく編集してください。

4

6 に答える 6

3

あなたが探しているのは否認防止だと思います。そうです、ここではハッシュだけでは不十分です。「完了した作業」、おそらくPKIについて、ある種の暗号化とデジタル署名を調べる必要があります。これはかなり広い分野です。認証と整合性検証の両方が必要になると思います(たとえば、 Piskvorがそれを行い、当時はこの方法で行いました)。

バーズアイビューをとるには、メインフローは次のようになります。

ユーザーのコンピューター:

  • プロセスを実行する
  • 結果の取得、タイムスタンプの追加など。
  • 公開鍵を使用して暗号化する
  • ユーザーの秘密鍵を使用して署名します(ここでユーザーを識別するための何らかの方法が必要になる場合があります-パスフレーズ、スマートカード、生体認証など)
  • サーバーに送信

サーバー上:

  • ユーザーの公開鍵を使用して署名を確認する
  • 秘密鍵を使用して復号化する
  • 必要に応じて処理する

もちろん、これにより、公開鍵インフラストラクチャである複雑で素晴らしい世界に入ることができます。ただし、正しく実行すれば、ログに表示される方法でイベントが実際に発生したことをかなり確実に確認できます。

于 2010-07-01T12:15:22.107 に答える
3

問題の核心にあるので、ここにあなたのコメントの1つを貼り付けています。

こんにちはエリック。このツールは公開されておらず、信頼できるユーザーの選択リストに表示されることを指摘しておく必要があります。分解されるツールは問題ではありません。私は暗号化についてあまり気にしません。私がする必要があるのは、それらが特定のプロセスを実行し、正当な結果を得たことを確認できることだけです。ツールはものを検証するので、何かが正常に機能していると思い込んでツールを実行しないようにしたくありません。

つまり、基本的に、私たちが防御している脅威は怠惰なユーザーであり、プロセスの実行に失敗し、単に「はい、アンディ、実行しました!」と言うだけです。これを解決するのはそれほど難しいことではありません。これは、暗号で解読できないシステムが必要ないことを意味します(この場合、それは不可能なので、幸運です!)-必要なのは、それを破壊するシステムだけです。ルールに従ってプロセスを実行するよりも、ユーザーにとってより多くの労力が必要です。

これを行う最も簡単な方法は、一定ではなく、確認しやすいいくつかの項目を取得して、それらをハッシュすることです。たとえば、応答メッセージは次のようになります。

  • システム日付/時刻
  • ホスト名
  • ユーザー名
  • テスト結果
  • HASH(システム日付/時刻|ホスト名|ユーザー名|テスト結果)

繰り返しになりますが、これ暗号的に安全ではありません-アルゴリズムを知っている人なら誰でも答えを偽ることができます-しかし、そうすることが実際にプロセスを実行するよりも厄介である限り、あなたは大丈夫です。システムの日付/時刻を含めると、ナイーブなリプレイ攻撃(前回と同じ回答を送信するだけ)から保護されます。これで十分です。

于 2010-07-05T00:39:58.433 に答える
2

プログラムの出力(「yes」または「no」のいずれか)を取得し、それを乱数と連結してから、その文字列のハッシュを含めるのはどうですか?

したがって、ユーザーが次のようなものを送信することになります。

YES-3456234
b23603f87c54800bef63746c34aa9195

これは、可能な出力が2つしかないにもかかわらず、固有のハッシュがたくさんあることを意味します。

次に、それを確認できますmd5("YES-3456234") == "b23603f87c54800bef63746c34aa9195"

ユーザーがmd5ハッシュを生成する方法を理解するのに十分な技術を持っていない場合は、これで十分です。

少し良い解決策は、ハッシュを生成するために別の(ハードコードされた「秘密の」)ソルトを連結することですが、このソルトは出力から除外します。

今あなたは持っています:

YES-3456234
01428dd9267d485e8f5440ab5d6b75bd

そして、あなたはそれを確認することができます

md5("YES-3456234" + "secretsalt") == "01428dd9267d485e8f5440ab5d6b75bd"

これは、ユーザーが自分のmd5ハッシュを生成するのに十分賢い場合でも、秘密のソルトを知らずに出力を偽造することはできないことを意味します。

もちろん、彼が十分に賢いなら、彼はあなたのプログラムから塩を抽出することができます。

もっと防弾が必要な場合は、適切な暗号署名の生成を検討しています。それに追加するのに役立つものは何もないので、Piskvorの回答を参照します:)

于 2010-07-01T12:14:44.140 に答える
1

理論的には、これはある種のプライベートソルトとハッシュアルゴリズム、基本的にはデジタル署名を使用することで可能になります。プログラムには、ハッシュの前に入力に追加するプライベートソルトがあります。プライベートとは、ユーザーがアクセスできないことを意味しますが、ソルトは知っています。

ユーザーは、自分の結果とプログラムによって生成された署名を送信します。したがって、を確認することで結果を確認できhash(result + private_salt) == signatureます。そうでない場合、結果は偽造されます。

実際には、ユーザーからソルトを隠すことができないため、これはほとんど不可能です。これは基本的に、この質問で説明されているのと同じ問題です。コード内の秘密鍵をどのように非表示にしますか?

于 2010-07-01T12:18:38.253 に答える
1

アプリケーションを、ソースコードにアクセスできない、またはアプリケーションが実行されているサーバーにアクセスできないWebアプリにすることができます。次に、アプリケーションはそのアクティビティをログに記録でき、それらのログを信頼できます。

ユーザーが実行可能プログラムを手に入れると、何でも偽造できます。

于 2010-07-01T14:17:05.140 に答える
1

暗号化を実際に探しているわけではないことに注意してください。

「否認防止」の答えはほとんどお金にかかっていますが、メッセージの送信元を保証するために本当に必要なのは、メッセージに安全に署名することだけです。あなたが知らないうちに誰かがあなたのメッセージを改ざんできない限り、誰かがあなたのメッセージを傍受して読むことができるかどうかは関係ありません。

情報がプレーンテキストで送信される前に(機密ではないため)同様のことを実装しましたが、あいまいな署名メカニズムにより、メッセージがクライアントソフトウェアによって生成されたと(合理的に)確信できるようになりました。

アプリが他の人のハードウェア上にある場合、基本的にセキュリティを保証することはできませんが、セキュリティは「確実性」ではなく、「自信」であることに注意してください。メッセージが改ざんされていないというビジネスニーズに十分な自信がありますか?

于 2010-07-01T14:22:56.650 に答える