YongWook's Notes

<상식> 문화상품권 시리얼 번호의 원리 본문

-software

<상식> 문화상품권 시리얼 번호의 원리

글로벌한량 2016. 5. 2. 09:41

문화상품권의 시리얼번호는어떻게 생성할까? 문화상품권을 찍어내고 시리얼번호는 데이터베이스에 저장할 것이라는 일반적인 생각과는 달리 문화상품권 회사는 시리얼번호를 저장하지 않는다. 현금과 직접적으로 연결되는 상품권이기 때문에 보안상의 위험도 크고 비효율적이기 때문이다. 대신 hash를 사용한다.


-문화상품권 시리얼번호 생성 및 확인
def myhash(x):
    y = ((x+11)**3 +(x+13)**2 + 35)**2
    y = y%10000
    return y

mcode = raw_input("문화상품권 번호를 입력하세요.")
if len(mcode) == 4:
    print mcode, myhash(int(mcode))
    print "문화상품권이 생성되었습니다"
    exit()

if len(mcode) != 8:
    print "문화상품권 번호는 반드시 8자리입니다"
    exit()
f = int(mcode[0:4])
s = int(mcode[4:])

print f, s

if myhash(f) == s:
    print "올바른 문화상품권 입니다"
else:
    print "당신의 문화상품권은 가짜입니다"


위의 예와 같이 특정한 hash함수를 만들어 놓고 그 함수에 대한 보안만 철저히 하면 나머지 첫 네자리 번호로 나머지 문화상품권의 번호를 만들어 낼 수 있다. 여차하면 4*3 으로 12자리 시리얼번호를 가지는 문화상품권을 만드는 경우 두개의 hash함수를 사용하며 첫 네자리로 다음 4~8번째 번호를 생성하고 4~8번째 번호를 두번째 hash를 이용해 9~12자리 번호 생성에 사용 할 수 있다. 


26자의 알파벳 대문자와 10진수 숫자를 사용하면 1,679,616가지의 경우를 만들 수 있다. 여기서 한자리를 추가하여 5자리 숫자 조합으로 만드는 등 hash에 들어가는 숫자개수를 늘리는 방법을 사용하면 충분히 많은 양의 문화상품권을 만들 수 있다.



Comments