1

機密データをデジタル署名されたファイルに保存して、その内容がいつ改ざんされたかを把握したいと思います。

私の最初の考えは、データはNVP(名前と値のペア)に格納され、内容を確認するための何らかのCRCまたはその他のチェックサムが含まれることです。

ANSI C ++を使用して、このようなファイルの作成(つまり書き込み)と検証(読み取り)を実装することを考えています。

これが私が保存したいデータであると仮定します:

    //Unencrypted, raw data to be stored in file
    struct PrivateInfo {
         double age; weight;
         FitnessScale fitness;
         Location  loc;
         OtherStuff stuff;
    };

    //128-bit Encrypted Data (Payload to be stored in file)
    struct EncryptedData {
     // unknown fields/format ??

    };

[この質問に対するいくつかの回答を読んだ後]

これまでに寄せられたコメントから判断すると、ほとんどの人にとっては危険信号のように思われる「ライセンス」という言葉に、人々が傍観されているのではないかと心配しています。そうかもしれないと思いましたが、セキュリティが高まり、一般的な緊張感が高まっている今日の雰囲気の中で、誰かが「核兵器のパスワード」を誰かに渡すことを考えていると思わないように、「隠す」必要があるものを詳しく説明したほうがいいと思いました。テロリストか何か。ここで、質問から「ライセンス」という単語を削除します。

技術的な質問としてもっと見てください。私が学生(私はそうです)であり、安全である必要がある情報をエンコードするための推奨(またはベストプラクティス)について調べようとしていると想像してください。

上記を念頭に置いて、質問を次のように再フォーマットします。

  1. さまざまなデータ型フィールドの構造体を考えると、「合理的に安全な」暗号化を提供するための「推奨」アルゴリズムは何ですか(私はまだ128ビットを使用することを好みますが、それは私だけです)
  2. 暗号化されたデータに対してROBUSTチェックを提供するための推奨される方法は何ですか。そのため、そのチェック値を使用して、ファイルの内容(暗号化されたデータのペイロード)が元のデータと異なるかどうかを知ることができます。
4

4 に答える 4

10

まず、データの「署名」(改ざんされたことを通知する)は、データの「暗号化」(他の人がデータを読み取れないようにする)とは完全に独立した独立した操作であることに注意してください。

そうは言っても、OpenPGP標準は両方を実行します。GnuPGは人気のある実装です:http ://www.gnupg.org/gph/en/manual.html

基本的に、次のことを行う必要があります。

  • キーペアを生成しますが、公開部分をわざわざ公開しないでください。
  • データに署名して暗号化します(これはgpgの単一の操作です)
  • ... ストレージ ...
  • 署名を復号化して確認します(これも単一の操作です)。

ただし、これは、残りのデータを保存するよりも安全に秘密鍵を保存できる場合にのみ使用されることに注意してください。キーのセキュリティを保証できない場合、GPGはデータの読み取りや改ざんの悪意のある試みに対してあなたを助けることはできません。また、他の暗号化/署名スキームも使用できません。

暗号化を忘れると、秘密鍵を使用して安全なサーバー上のデータに署名し、公開鍵を使用してユーザーのマシンでデータを検証できると考えるかもしれません。これは問題ありませんが、ユーザーが悪意を持って賢い場合は、新しいデータを作成し、独自の秘密鍵を使用して署名し、コードを変更して公開鍵を自分の公開鍵に置き換えることができます。その後、データが検証されます。したがって、脅威モデルによると、公開鍵のストレージは改ざん防止が必要です。

次のようなものを自分で実装できます。

  • ランダムな文字の長い文字列を選択します。これがあなたの鍵です。
  • データをキーと連結します。安全なハッシュ関数(SHA-256)でこれをハッシュします。次に、結果のハッシュをデータと連結し、キーと安全な対称暗号(AES)を使用して暗号化します。
  • ... ストレージ ...
  • データを復号化し、ハッシュ値を切り取り、キーを元に戻し、ハッシュし、結果をハッシュ値と比較して、変更されていないことを確認します。

これはおそらくgpgよりも高速で、合計で使用するコードが少なくなります。まず、PGPは公開鍵暗号であり、ここで必要とされる以上のものです。しかし、自分でローリングするということは、いくつかの作業を行い、コードの一部を記述し、今説明したプロトコルに愚かなエラーがないことを確認する必要があることを意味します。たとえば、データが固定長でない場合、HMACが解決する潜在的な弱点があります。

優れたセキュリティは、他の賢い人があなたのためにした仕事をすることを避けます。これは高潔な種類の怠惰です。

于 2009-12-15T11:55:25.057 に答える
1

えーと、GPGのようなよく知られた暗号化システムを使ってみませんか?

于 2009-12-15T11:42:53.523 に答える
0

質問の言い回しを変更して、それが人々を幸せにするかどうかを確認します(または私は反対票を投じます)。質問には、実際には2つのタイプがあります。

  1. あなたはコンピュータゲームを作っており、誰かがあなたの保存ファイルをいじっているかどうか知りたいと思っています。(データ署名)

  2. あなたはメッセージングプログラムを書いていて、人々のメッセージログを非公開にしておきたいと思っています。(データ暗号化)

2つ目(データ暗号化)を扱います。これは非常に難しいトピックであり、事前に作成されたプログラム(PGP / GPGなど)を探す必要があります。それでも、正しく理解して使用するには多くの時間がかかります。このような暗号化について考えてみてください。それは壊れます。あなたの仕事はそれを努力する価値がないようにすることです。言い換えれば、それを破るのに必要な努力を情報の価値よりも大きくする。

最初のものに関しては、再びそれは壊れる可能性があります。ただし、チェックサムは良い考えです。その上でいくつかのリンクについては、アムノンの答えを参照してください。

これがあなたを正しい方向に向けることを願っています。私はどちらのトピックの専門家でもありませんが、これが出発点になることを願っています。(質問を言い換えて、より良い答えが得られるかどうかを確認することをお勧めします)

于 2009-12-15T12:32:23.847 に答える
0

編集された質問への回答は、特定のシナリオによって異なります。

q1(暗号化)の場合:サーバーで暗号化および復号化する場合は、対称鍵アルゴリズムを使用できます。それ以外の場合は、公開鍵暗号を使用することをお勧めします。

q2の場合、ファイルが変更されたかどうかを確認したいだけの場合は、ハッシュ自体が変更されていないことを確認できると仮定して、 SHA-1などの暗号化ハッシュを使用できます。

データジェネレータとベリファイアの両方が安全である場合は、 HMACなどのMACアルゴリズムを使用して、データとMACが一致することを確認できます。ただし、これは秘密鍵が秘密のままである場合にのみ機能します。そうしないと、デジタル署名を使用できる場合があります。

于 2009-12-15T12:03:03.270 に答える