创建小(<10位),而不是(非常)安全"哈希"的想法

Jai*_*ime 16 encryption hash encode checksum

我正在开发一个在线活动票务系统,用户可以自行打印他的票据并出现在将被扫描的事件(条形码),理想情况下,这个人会进入.我的问题是如何创建一个满足以下要求的"票证代码":

  • 每个"票证代码"需要彼此充分不同(即不按顺序编号)
  • 理想情况下,车票将与中心数据库,以避免重复使用进行检查,但它需要能够工作过太行,在这种情况下,系统必须检查是否有"有效"票代码和它没有在使用门.
  • "票证代码"必须足够小,以便在需要时方便键入
  • 持票人只需要门票进入(即没有身份证检查)

数据范围非常小,4天内只有大约20个活动,每个活动约5,000张门票(约100,000个不同的门票代码)

现在我有几个字段没有打印在故障单上,用户不知道我可以使用它来编码部分"票证代码",所以我可以使用EventId,OrderId,EventDate和一些盐来创建一个小的"哈希"部分代码(想法?),但我仍然坚持顺序或GUID(太长)的票证ID

那么关于如何做到这一点的任何想法或指示?

Unk*_*own 12

为什么重新发明轮子?做这样的事情(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]
Run Code Online (Sandbox Code Playgroud)

例:

活动编号1

机票编号123

createticket(1,123)
# output: 2d7f242597
Run Code Online (Sandbox Code Playgroud)

售票员先生带着他的验证员到场,并输入事件/票号和哈希:

def verifier(eventnum, ticketnum, hash):
    return hash == createticket(eventnum, ticketnum)

verifier(1,123, "2d7f242597")
# ouput: True
Run Code Online (Sandbox Code Playgroud)

  • @jaimedp,这就是为什么当您打印票证时,您包括事件编号和票号以及哈希.使用散列的前x个数字是完全有效的,因为所有良好的加密散列应该将熵分配给所有数字(雪崩效应). (4认同)

Ali*_*xel 5

我建议你试试Verhoeff算法吧.


kqu*_*inn 1

考虑一个基于 Feistel 网络的非常简单的方案,用于排列票证 ID 号等。这条消息(恰好出现在 PostgreSQL 列表中,但与 PostgreSQL 没有太大关系)描述了一个简单的Feistel 网络。在每张门票上,您可以打印门票 ID 号(按顺序选择),然后打印“门票密码”,该密码是通过 Feistel 网络输入 ID 号的结果。可能的变化包括在密码上附加一个校验位,以及将 Feistel 网络的输入不仅仅基于顺序生成的数字(数字 + 10,000 * 事件 ID 号等)。