シリアル番号スキームをブレーンストーミングしています。私はそれを間違っていますか?
-
14-10-2019 - |
質問
シリアル番号形式:
- 24ヘクスのキャラクターに加えて、読みやすさのためのハイフンで表される24オクテット
例D429-A7C5-9C15-8516-D15D-3A1C
- 0-15:{電子メール+マスターハッシュ}
- 16-19:{id}
- 20-23:{タイムスタンプ}
電子メール+マスターハッシュアルゴリズム:
- ユーザーのメールのMD5ハッシュ(32バイト)を生成する
- 非公開マスターキーのMD5ハッシュを生成します
- Xorこれら2つのハッシュ
- 奇数バイトを削除し、サイズを16に減らします
- 例D429A7C59C158516D15D3A1CB00488ED-> D2AC9181D531B08E
ID:
- 最初は0x00000000、その後、各ライセンスが販売された状態で増加しました
タイムスタンプ:
- ライセンスが購入されたときに生成されるタイムスタンプ
検証:
- 製品を登録するには、ユーザーは1)メールアドレスと2)シリアル番号を入力する必要があります
- メール+マスターハッシュを生成し、シリアルの0-15に一致することを確認します
- シリアルからタイムスタンプを抽出し、それが<現在のタイムスタンプであることを確認し、> =最初のライセンスが販売されています
解決
私はこれについて専門家ではありませんが、このアプローチに問題があるかもしれないことがいくつかあります。
- MD5を使用することは良い考えのようには見えません。 MD5にはセキュリティの弱点が既知であり、十分な時間のある人が手にある人は、ある種のハッシュ衝突を簡単に思いつくことができます。シリアル番号の使用方法によっては、他のシリアル番号に一致するように見えるシリアル番号を簡単に偽造できます。 SHAファミリーから何かを使用すると、これを防ぐことができます。
- マスターキーを使用したユーザーの電子メールハッシュのXORは特に安全ではありません。自分のメールのハッシュでシリアル番号をXAREでXORINGすることで、マスターキーのハッシュを簡単に回復できます。
- 安全なハッシュからすべての奇数バイトをドロップすると、ハッシュが安全であるという保証が破壊されます。特に、適切なセキュリティ保証を持つハッシュ機能には、通常、結果のハッシュのすべてのバイトが出力にあることが必要です。例として、最初のハッシュの出力を取得し、すべての古いバイトの間に0を散在させ、結果を出力することにより、既存の安全なハッシュ関数から安全なハッシュ関数を簡単に構築できます。私の新しいハッシュのセキュリティプロパティを破ることができれば、元のハッシュのセキュリティプロパティを破ることに相当するため、安全です。ただし、新しいハッシュから均等なバイトをすべて落とすと、すべてのゼロを取得しますが、これはまったく安全ではありません。
- IDには4つのバイトが十分ですか?それはあなたに2^32の異なるIDのみを与えます。
他のヒント
TemplateTypedefの返信に追加するいくつかのポイント:
メールとマスターキーのハッシュを組み合わせる必要がある場合は、両方の連結をハッシュします。さらに良いことに、誰かが2つ以上のライセンスを購入してパターンを確認した場合に備えて、「より良い」セキュリティのためのハッシュメール+キー+IDです。
16バイトのみを与えるハッシュ関数を使用します。 MD5を使用する必要がある場合、切り捨ては等しく悪いので、最初の16バイトを撮影してください。
IDは検証で使用されることはありません。
キー共有(Warezサイトなど)から保護されません。
シリアル番号は、ごく少数の攻撃からあなたを保護します。それはおそらくあなたの時間と労力の価値がないでしょう。
所属していません StackOverflow