소규모 (<10 자리)를 만들기위한 아이디어는 (매우) 보안“해시”가 아닙니다.

StackOverflow https://stackoverflow.com/questions/890907

문제

나는 온라인 이벤트 티켓팅 시스템을 연구하고 있는데, 여기서 사용자는 티켓을 스스로 인쇄하고 스캔 할 이벤트 (바코드)에 나타날 수 있고 이상적으로는 사람이 들어가는 이벤트에 나타날 수 있습니다. 내 문제는 내 문제를 만드는 방법입니다. 다음 요구 사항을 충족하는 "티켓 코드"

  • 각 "티켓 코드"는 서로 충분히 달라야합니다 (즉, 순차적으로 번호가 매겨지지 않음)
  • 이상적으로는 티켓이 재사용을 방지하기 위해 중앙 DB에 대해 확인되지만 라인에서 작업 할 수 있어야합니다.이 경우 시스템은 "유효한"티켓 코드를 점검해야하며 사용되지 않았습니다. 이것 문.
  • "티켓 코드"는 필요한 경우 키를 키우기에 충분히 작아야합니다.
  • 티켓 보유자는 들어가기 위해 티켓 만 필요합니다 (예 : ID 확인 없음)

데이터의 범위는 매우 작으며 이벤트 당 약 5,000 티켓 (약 10 만 개의 다른 티켓 코드)으로 4 일 동안 약 20 개의 이벤트 만 있습니다.

이제 티켓에 인쇄되지 않고 "티켓 코드"의 일부를 인코딩하는 데 사용할 수있는 사용자에게 알려지지 않은 여러 필드가 있으므로 eventId, OrderID, EventDate 및 일부 소금을 사용할 수있어 작은 것을 만들 수 있습니다. " 해시 "코드의 일부 (아이디어?)의 경우, 나는 여전히 순차적이거나 안내 인 티켓 ID에 갇혀 있습니다 (너무 길다)

그래서이 작업을 수행하는 방법에 대한 아이디어 나 포인터가 있습니까?

도움이 되었습니까?

해결책

Ticket ID 번호와 같은 Feistel 네트워크를 기반으로 매우 간단한 체계를 고려하십시오. 이 메시지 (PostgreSQL 목록에 있지만 PostgreSQL과 관련이 없습니다)는 간단한 것을 설명합니다. Feistel 네트워크. 각 티켓에서 티켓 ID 번호 (순차적으로 선택된)를 인쇄 한 다음 "티켓 비밀 코드"를 인쇄 할 수 있으며, 이는 Feistel 네트워크를 통해 ID 번호를 넣은 결과입니다. 가능한 변형에는 비밀 코드에 체크 숫자를 추가하고 순차적으로 생성 된 숫자 (숫자 + 10,000 * 이벤트 ID 번호 등) 이상의 Feistel 네트워크에 입력을 기반으로하는 것이 포함됩니다.

다른 팁

왜 바퀴를 재창조합니까? 이와 같은 일을하십시오 (파이썬 코드, 설명이 필요한지 물어보십시오) :

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. 숫자에 대해 임의의 숫자 또는 최소한 무작위 부품을 생성하고 중앙 데이터베이스에 저장하십시오. 그런 다음 모든 게이트 시스템에 데이터베이스를 다운로드하여 확인하십시오.
  2. 숫자는 자급 자족해야합니다. 다시 말해, 숫자는 저장된 목록없이 확인할 수 있어야합니다. 이것은 일종의 체크섬 시스템처럼 들립니다. 예를 들어, 1 이상에서 숫자를 발행하고, 5 자리 (00000-99999 = 100.000 숫자)를 만들고 1-3 글자를 선불로 만들어 체크 아웃 할 수있는 체크섬으로 끝날 수 있습니다.

오프라인 확인을 위해서는 하나의 쉬운 해결책 만 볼 수 있습니다.

티켓 ID에 티켓 ID의 해시와 이벤트 소금을 추가하십시오. 암호화 해시를 원하는 크기로 잘릴 수 있습니다. 기본 티켓 ID 자체에 임의의 숫자 만 사용해야 할 특별한 이유를 생각할 수 없습니다.

이를 통해 티켓 ID의 크기를 제한하고 티켓 ID의 크기와 관련하여 분명히 비례 보안을 가질 수 있습니다.

CRC 계산을 수행 할 수 있습니다.

기본적으로 문자열에 각 문자를 추가하기 시작하고 길이를 긴 정수로 제한하십시오.

알려진 임의의 숫자로 시작하여 처음 4 바이트에 저장할 수 있으며, 마지막 4 개를 앞에서 설명한대로 계산하십시오.

이것은 두 개의 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를 제공합니다).
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top