Подтвердить что ты не робот

Идеи создать небольшой (<10 цифр), а не (очень) безопасный "хеш"

Я работаю над системой онлайн-билетов, где пользователи смогут самостоятельно распечатывать свои билеты и появляться на мероприятии, где он будет сканироваться (штрих-код), и в идеале человек будет входить. Моя проблема в том, как для создания "кода билета", который удовлетворяет следующим требованиям:

  • каждый "код билета" должен быть достаточно отличающимся друг от друга (т.е. не последовательно пронумерован)
  • в идеале, билет будет проверен на центральную БД, чтобы предотвратить повторное использование, но ему НЕОБХОДИМО иметь возможность работать вне линии, и в этом случае система должна проверить "действительный" код билета и что он не был используется в этих затворах.
  • "код билета" должен быть достаточно мал, чтобы облегчить его при необходимости.
  • обладателю билета потребуется только билет, чтобы войти (т.е. нет проверки личности).

Диапазон данных очень мал, в течение 4 дней будет всего около 20 событий с примерно 5000 билетов на одно событие (около 100 000 различных кодов билетов).

Теперь у меня есть несколько полей, которые не напечатаны в билете и неизвестны пользователю, которые я могу использовать для кодирования части "кода билета", поэтому я мог бы использовать EventId, OrderId, EventDate и некоторую соль для создания небольшой "хеш" для части кода (идеи?), но я все еще придерживаюсь идентификатора билета, который является последовательным или GUID (будет слишком длинным)

Итак, любые идеи или указатели на то, как это сделать?

4b9b3361

Ответ 1

Рассмотрим очень простую схему, основанную на сети Файстеля, чтобы переставить, например, идентификационный номер билета. Это сообщение (которое входит в списки PostgreSQL, но на самом деле не имеет особого отношения к PostgreSQL) описывает простой сеть Feistel. На каждом билете вы можете распечатать идентификационный номер билета (последовательно выбранный), затем "секретный секретный код", который является результатом ввода идентификационного номера через сеть Feistel. Возможные варианты включают добавление контрольной цифры в секретный код и ввод входного сигнала в сеть Фейстеля не более, чем только последовательное сгенерированное число (номер идентификатора номера + 10000 * и т.д.).

Ответ 2

Зачем изобретать колесо? Просто сделайте что-нибудь подобное (код 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

Mr ticketman приходит со своим верификатором и вводит номер события/билета и хэш:

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

verifier(1,123, "2d7f242597")
# ouput: True

Ответ 4

Два способа увидеть:

  • Создайте случайное число или, по крайней мере, случайную часть для числа, и сохраните его в центральной базе данных. Затем загрузите базу данных во все системы ворот, чтобы проверить ее.
  • Число должно быть самодостаточным. Другими словами, число должно быть в состоянии проверить без сохраненного списка. Это звучит как какая-то система контрольной суммы. Например, вы можете выдавать цифры от 1 и выше, сделать их 5 цифр (00000-99999 = 100 000 номеров) и предварительно наложить 1-3 буквы, убедившись, что в итоге вы получите контрольную сумму, которая будет проверяться.

Ответ 5

Для автономной проверки я вижу только одно простое решение.

Добавьте к идентификатору билета идентификатор билета и соль для каждого события. Вы можете урезать любой криптографический хеш до желаемого размера. Я не могу придумать какую-либо конкретную причину использовать что-либо, кроме случайного числа для самого идентификатора базового билета.

Это позволяет вам ограничить размер идентификатора билета и иметь четко пропорциональную защиту по отношению к размеру идентификатора билета.

Ответ 6

Вы можете сделать расчет CRC.

В принципе, просто начните добавлять каждый символ в строку и ограничьте длину длинным целым числом.

Вы можете начать с известного случайного числа и сохранить его в первых 4 байтах, а последние четыре - вычислять, как я описал ранее.

Это будет два ints или восемь байтов.

Ответ 7

Здесь схема, которая имеет то преимущество, что позволяет вычислить следующий хэш хэша из предыдущего (так что вы можете проверить, отсутствует ли он), но не позволяет посторонним рассчитать следующий:

Ticket.0 = substring(HASH(SALT + IV        ), 0, LENGTH)
Ticket.i = substring(HASH(SALT + Ticket.i-1), 0, LENGTH)

где

  • HASH - любая хеширующая функция, которая равномерно распределяет свою энтропию по выходной строке
  • SALT - постоянная, которую вы держите в секрете; это хорошая идея использовать другое для каждого события.
  • IV - это еще одна константа, которую вы храните в секрете
  • LENGTH - это длина идентификатора билета, который вы хотите (10 в вашем вопросе, но 12 не может быть и речи, и дает вам в 256 раз больше идентификационных номеров)