アイデアを小(<10桁)(非常に)確保"のハッシュ"
-
23-08-2019 - |
質問
ようにオンラインイベント発券システムは、ユーザーが自己印字彼のチケットのイベントでスキャン(バーコード)と理想の人を取得します。私の問題の作成方法"チケットコード"を満たすように、以下の要件:
- それぞれのチケットのコードを"必要十分ごとに異なるその他(ieな順番)
- 理想のチケットに対してチェックする必要のある中央DB防止への再利用がでることができるとオフラインでも、その場合、システムは、チェックのための"有効"のチケットのコードで用いていません この ゲートがあります。
- の"チケットコード"は十分小さいためキーが必要な場合
- のチケットホルダーだけでのチケットを(ieなIDチェック)
の範囲のデータは非常に小さいので、あまで約20イベントの4日間約5,000券りイベント(約100,000異なるチケットのコード)
しかし、今までくつかの分野ではリーチケットは、あまり知られていませんが、ユーザーが利用できるエンコードのチケットのコードで使うことがでのEventId,orderidトランザクション,EventDate、一部の塩を小さな"ハッシュ"のためのコード(アイデア?), だが、やはりこだわったのチケットのidはシーケンシャルやガイド(おもてなしをモダン過ぎると長)
その他アイデアやヒントをどうるのか?
解決
、言って、チケットID番号を置換するためにFeistel構造に基づいた非常にシンプルなスキームを考えてみましょう。 PostgreSQLのリストにあることを起こるこのメッセージの(しかし、実際のPostgreSQLとはあまりありません)簡単なのFeistelネットワークを説明します。各チケットでは、あなたは、チケットID番号(順次選択)、フェイステルネットワークを介してID番号を入れた結果だ「チケット秘密のコード」を印刷することができます。可能な変形は、秘密コードにチェックデジットを付加し、単に順次生成数(エトセトラ数+万*イベントID番号)よりも上のFeistelネットワークへの入力を基づか含む。
他のヒント
なぜ車輪の再発明?ただ、(あなたが明確化が必要な場合は私に尋ねる、Pythonのコード)は、このような何かをします:
import hashlib
secretpassword = "blah"
def createticket(eventnum, ticketnum):
m = hashlib.md5() # or any crypto hash you like
m.update("%s%s%s" % (eventnum, ticketnum, secretpassword))
return m.hexdigest()[:10]
例:
イベント番号1
チケット番号123
createticket(1,123)
# output: 2d7f242597
氏のticketmanは彼の検証に来るとイベント/チケット番号とハッシュに入ります:
def verifier(eventnum, ticketnum, hash):
return hash == createticket(eventnum, ticketnum)
verifier(1,123, "2d7f242597")
# ouput: True
私はあなたが Verhoeff氏アルゴリズムを試します。
二つ見えます:
- ランダムに生成し、少なくともランダムに一部、大切に保管してくださの中央データベースダウンロードして、データベースへのゲートシステムのチェック。
- にする自己充足している。つまり、この数をチェックインすることはできず、保存されます。この音のようにチェックサムシステム。例えば、通し番号からの1以上であり、それを5桁(00000-99999=100.000番号)、およびprepende1-3文字、またチェックサムとチェックアウトいただけます。
オフライン検証のために、私は唯一の簡単な解決策を参照してください..
チケットIDにチケットIDごとのイベントの塩のハッシュを追加します。あなたは所望のサイズに任意の暗号化ハッシュを切り捨てることができます。私は基本チケットID自体の乱数以外のものを使用する特定の理由を考えることはできません。
これは、あなたがチケットIDのサイズを制限し、チケットIDの大きさとの関係で明確に比例し、セキュリティを持つことができます。
あなたはCRC計算を行うことができます。
基本的には、単なる文字列内の各文字を追加し、長整数の長さを制限するために開始します。
あなたが知られている乱数を用いて開始し、最初の4バイトに格納し、私は前述のように最後の4つの計算とすることが有していてもよいです。
これは2つのint、または8つのバイトであろう。
この制度を活用させるよう計算し、次のチケットのハッシュからの前できるかどうかを検証するかが欠け)がないよう外部の計算は次の:
Ticket.0 = substring(HASH(SALT + IV ), 0, LENGTH)
Ticket.i = substring(HASH(SALT + Ticket.i-1), 0, LENGTH)
場所
HASH
はハッシュ関数と分布、そのエントロピーの比較的均一に、出力文字列SALT
は一定のままで。で使うようにするといいでしょう異なる各イベントIV
も一定のままで秘密- 長さの長さのチケットのIDです(10あなたの質問ですが、12の質問を与えてくれ256倍のチケットId)