1

ブレットが与えたこの例を使用しています:

文字列の暗号化と復号化

そしてこれを行う:

public static bool VerifyLicenseKey(string applicationGuid)
{
  Console.WriteLine("G: " + applicationGuid);
  var appSettings = AppSettings.GetInstance();
  if (appSettings == null)
  {
    return false;
  }
  var hwinfo = HardwareInfo.GetHardwareSerial();
  Console.WriteLine("h: " + hwinfo);
  Console.WriteLine("a: " + applicationGuid);
  var currentSerial = Crypto.EncryptStringAES(hwinfo, applicationGuid);
  Console.WriteLine("c: " + currentSerial);
  Console.WriteLine("o: " + appSettings.LicenseSerialNumber);
  if (currentSerial == appSettings.LicenseSerialNumber)
  {
    return true;
  }
  return false;
}

}

GetHardwareSerialとはapplicationGuid毎回同じように戻ってきますが、 を呼び出すとEncryptStringAESそうではありません。

間違ったクラスを使用していますか? 毎回同じだと思いませんか?

そうでない場合、誰かが暗号化された値が同じであるより良い例を持っていますか?

4

3 に答える 3

4

あなたの「暗号化」は実際には単なる難読化であり、バイパスするのはそれほど難しくありません。知っておく必要があるのは、アプリケーション GUID (おそらくパブリックに格納されている) と、同じハードウェア ID を取得する方法 (おそらくそれを書いていないため、簡単に見つけることができる) だけです。

もちろん、保護をどの程度機能させたいかは、ソフトウェアの価値や量にも依存するため、単純な難読化で十分な場合があります。ここで必要なのは、アプリケーション GUID、ハードウェア番号、ユーザー名などを一緒にハッシュしてハッシュを保存できる SHA や MD5 などのハッシュ アルゴリズムです。ほとんどの典型的なユーザーにとって、これは抑止力として十分です。

破られにくい保護が必要な場合は、デジタル署名と有効化手順が必要です。RSACryptoServiceProviderを参照してください。

基本的に、秘密鍵を知っているサービスを作成し、対応する公開鍵をソフトウェアに配置します。次に、ソフトウェアから、HardwareInfo および検証したいその他の情報を使用してサービスを呼び出すと、サービスはそれに署名し、署名ハッシュを返します。

クライアント側でそれを取得したら、公開鍵を使用して署名を確認できます。情報はプレーンテキストで保存できますが、署名を簡単に再作成することはできません。

詳細については、この質問も確認してください。

于 2013-02-12T15:29:35.797 に答える
3

あなたが参照しているアルゴリズムはRijndaelManagedクラスを使用しており、新しいインスタンスを作成するたびに(かなり正しく)自動的に新しいランダム値に設定されるIVプロパティのデフォルト値を使用しているようです(ドキュメントを参照)。

したがって、毎回異なる結果が得られます。(たとえば、WikipediaでIV の目的の詳細を確認できます。)

于 2013-02-12T15:13:23.607 に答える
0

ええ、ほとんどの AES 暗号化は非決定論的です (そして正当な理由により) うまくいきませんが、暗号化の結果を比較したいだけで、実際には復号化したくないので、代わりにHMACを使用することをお勧めします。

于 2013-02-12T15:47:53.790 に答える