6자리 리딤코드는 어디까지 안전하게 만들 수 있을까
· 약 17분
6자리 영문 대문자와 숫자로 리딤코드를 만들어야 한다고 해보자.
36^6 = 2,176,782,336
log2(36^6) = 약 31.02비트
가능한 문자열은 21억 개가 넘는다. 처음 보면 중복과 추측을 모두 걱정하지 않아도 될 만큼 커 보인다. 하지만 실제 발급기를 설계하면 이 숫자 하나가 서로 다른 네 문제를 가리고 있다는 사실을 만나게 된다.
- 형식: 코드는 정확히 6자리 ASCII
0-9,A-Z여야 한다. - 고유성: 서로 다른 발급 건이 같은 코드를 가져서는 안 된다.
- 예측 저항: 관측한 코드로 다음 코드를 계산하기 어려워야 한다.
- 유효성: 문자열이 형식에 맞는다는 것과 실제 발급되어 사용할 수 있다는 것은 다르다.
이 글은 여러 사람이 함께 쓰는 공개 프로모션 코드가 아니라, 발급 건마다 하나씩 만들어져 그 문자열을 가진 사람이 혜택을 청구하는 bearer형 리딤코드를 다룬다. 한 문제를 해결하는 수학이 다른 문제의 답이 되지는 않는다.
중복 없는 생성, 발급 순서 은닉과 유효한 리딤 판정은 서로 다른 요구사항이다.