2009-12-18 3 views
10

저는 우리 웹 사이트에서 MP3로 교환 할 수있는 바우처를 만들어 내 밴드 음악을 판매 할 수있는 작은 시스템을 만들고 있습니다. .Human Readable GUID

  1. 길이와 내용면에서 인간의 가독성 어떤 수준은, 사용자 좌절과 데이터 입력을 방지하기 위해 :

    상품권은 코드에서 사용자 유형은 다음과 같은 특성을 가질 필요가 코드가 필요합니다 오류.

  2. 하나의 바우처 코드가 주어지면 다른 바우처 코드를 추측 할 수 있습니다.

GUID를 사용하는 경우 점 1에 대해 우려하고 있습니다. 점진적 정수를 사용하면 점 2에 대한 우려가 있습니다. 그 사이에 행복한 매개체가 있어야합니다. 맞습니까? 아마도이 작업이 이미 완료되었다고 생각하고 나를 위해 기다리는 이상적인 해결책이있을 것입니다. 그것의 부재에서, 나는 무작위 영숫자 문자열, 또는 가능한 문자 만 (명확성을 위해 I와 O는 제외)으로 가고, 응용 프로그램이 X 번 실패한 IP 주소를 차단하게 할 것이라고 생각하고있다. 가능한 무력 공격. 내가 그걸 가지고 갔다면, 문자열의 길이와 X의 가치는 무엇일까요? 그리고 그 이유는 무엇입니까?

도움 주셔서 감사합니다.


업데이트 : 방법에 대해 전혀 명시하지 않았다 : 다음 공연 후 "판매"코드를 입력, 인쇄 쿠폰 코드의 목록을 생성합니다. 따라서 유효성 검사 서버를 사용하지 않는 소프트웨어 키에있는 것처럼 체크섬과 같은 요소는 필요하지 않습니다.

+0

도움이되는 모든 의견 및/또는 이국적인 제안을 보내 주셔서 감사합니다. Koper은 Mark Ransom과 함께 실용성과 간편함을 얻었습니다. –

+0

무차별 공격을 차단하는 데부터 시작하겠습니다. 당신과 당신의 밴드와 관련해서, 그것은 당신이 정말로 중요한 것을 보호하고있는 것처럼 아닙니다. 그것은 나에게 조금 불균형 한 것처럼 보인다. –

+0

당신은 절대적으로 옳습니다. 나는 시스템을 설계하는 데 너무 많은 재미를 느끼고 있습니다. 하지만 거기 에선 프로그래머입니다. 더하기, 만약 모든 것이 작동한다면 나는 다른 밴드의 앨범을 주최 할 것입니다. –

답변

4

8 자의 영숫자 (I 및 O 제외) 만 1785793904896 개의 가능한 조합을 갖습니다. 그것은 5 십억 바우처가 없다면 예상 할 수없는 모든 의도와 목적을위한 것입니다.

2

5 개의 문자로 구성된 5 개의 블록으로 충분해야합니다. "키"는 4 블록, 유효성을 보장하기위한 체크섬은 다섯 번째 블록으로 충분해야합니다. 물론 전체 키 공간을 사용하지 마십시오.

대략적으로 소프트웨어 일련 번호가 어떻게 배치되어있는 것처럼 보입니다.

+0

재미있는, 나는 결코 그것을 알지 못했다! 그러나 내 시스템의 경우 이러한 알고리즘을 직접 적용 할 수는 없으므로이 숫자를 미리 생성 한 다음 공연 후에 판매 한 코드를 "확인"해야합니다. –

+0

그것은 여전히 ​​적용 가능합니다. 결국 모든 코드를 제공 할 필요는 없습니다. –

9

영문 음절에 대해 훈련 된 Markov Chain을 사용하여 발음이 가능한 횡서적인 단어로 구성된 문장을 만들 수 있습니다. 생성 된 문장을 인쇄 할 때 유효한 바우처의 데이터베이스에 추가하면됩니다 (물론 구속되었을 때 무효화됩니다).

+8

http://thedailywtf.com/Articles/The-Automated-Curse-Generator.aspx –

+0

을 생각 나게합니다. N-gram 분석 형식을 사용할 수도 있습니다. 이해하기 쉽고 구현하기가 쉽습니다. http://en.wikipedia.org/wiki/N-gram –

+0

마지막 코멘트는 다소 혼란 스럽습니다. N 그램 분석을 사용하여 "교육"부분을 수행 할 수 있습니다. –

2

흠, 나는 대부분의 시스템이 어떻게 작동하는지 모르지만 정적 번호를 정의하고 그 번호에 임의의 다른 번호를 곱하면 깔끔하고 간단 할 것이라고 생각합니다. 그렇다면 큰 GUID가 정적의 배수라면 좋다.

쉬운 생산은 새로운 하나를 추측하기 어려운 (단기간 만 사용)

int i = 61234; 
int j = rand()%99999 
long GUID = i * j; 

전화 번호 길이 GUID 당신에게

을 줄 것이다에만 99999하지만 사용! doh

+1

흠, 내가 100,000 번 판매를 못하면 우리 앨범은 플래티넘에 갈 수 없다! –

4

AOL은 보낸 CD에 대해 두 단어의 임의의 조합을 사용했습니다. 동일한 접근 방식을 취할 수 있으며 필요한 단어를 늘리면 원하는 확률을 얻을 수 있습니다.

+0

나는 이것을 좋아한다! 3 단어와 4 문자 단어의 [이 목록] (http://www.math.toronto.edu/jjchew/scribble/lists/common-234.html)의 세 단어는 128,405,466,125의 키 공간을 가질 것입니다. 매우 수용 가능합니다. –

1

간단한 해결책 중 하나는 대부분의 언어가 문자열 유형에 대해 갖는 getHashCode 메소드를 호출하는 것입니다. 승인 된 단어 목록에서 문자열을 일부 단어로 설정하십시오. 그런 다음 gethashcode라고 부르면 그 열쇠가됩니다. 이를 확인하려면 기존 단어 해시 목록과 비교하고 다시 사용할 수 없도록 목록에서 삭제하십시오.

5

독자적인 인코딩 체계를 사용합니다. 최적의 가독성을 위해 I 및 O를 생략하는 것 이외에도 동음 이의어 집합 (C/E, M/N) 및 W와 같은 다중 음절 문자에서 한 문자 만 제외하고 모두 생략하는 것이 좋습니다. 하나의 경우.

길이에 관계없이 60 비트와 4 비트 체크섬을 사용할 수 있습니다. 64 비트는 수천 년 동안 밀리 초 단위의 시간을 저장하기에 충분하므로 모든 실제적인 목적을 위해 추측 할 수 없습니다. 한 글자 당 4 비트라고하면 16 글자입니다. 길이가 절반이라도 충분할 것입니다.

이것에 대해 생각해 볼 수있는 또 다른 방법은 자동차 번호판 형태입니다. 3 자 및 3 개의 숫자는 꽤 큰 주를 덮기에 충분하며 매우 읽기 쉽습니다. 누군가가 고속으로 코드를 해킹 할 수있는 방법을 제공하지 않는다면, 인간의 시간 척도에서는 당연히 추측 할 수 없을 것입니다.

+1

동음 이의어 집합! 이것은 내가 와야 할 것입니다. :) –

+0

@RickNZ : 64 비트 타임 스탬프는 Windows NTFS 및 OpenVMS에서 사용됩니다. 둘 다 초당 천만 틱으로 계산됩니다. 연도 범위는 NTFS의 경우 1601 ~ 60,055이고 VMS의 경우 1858 ~ 31,084입니다. (VMS는 상대 시간의 범위에서 "음의"절반을 예약합니다.) – wallyk

+0

내 업데이트보기 ... – RickNZ

2

모든 모음을 피하는 것이 가장 좋을 것입니다. 따라서 모든 맹세를 피하십시오.

[*] W가 포함 된 경우 W 포함!

+1

W는 단 복수의 음절 문자이기 때문에 말할 시간이 오래 걸립니다. 따라서 "www "웹 사이트 용!). – RickNZ

+2

"더빙 더빙"이라고하지 않습니까? – wallyk

+0

"여행 더빙"을 기억하십니까? 또는 악화, 라디오에서 90 년대에 다시 당신은 "아치 티 티 오줌, 콜론, 슬래시, 슬래시, 슬래시 ..." –

1

나는 바우처를 구입할 때 이메일 주소를 받았다고 가정하고 있습니다. 그렇다면 단일 사용 GUID를 이메일로 보내지 않는 이유는 무엇입니까? 그런 식으로 당신과 그들 모두는 기록을 가지고 있으며, 당신은 추론을 추적 할 수 있고, 추측의 위험을 감수하지 않고 (또는 최소한 귀찮은 가치가있는 것은 아닙니다), 사용자는 거기에 있기 때문에 아무 것도 기억할 필요가 없습니다 이메일을 보내고 코드를 작성할 필요가 없습니다.

이메일 주소를 알려줍니다. GUID를 이메일로 보냈습니다 (링크 포함). 그들은 링크를 클릭하고 노래를 얻습니다. GUID 사용이 시스템에 등록되어 더 이상 작동하지 않습니다.

+2

팬 이메일 주소 목록을 얻으려는만큼 억지력으로 작용할 것이라고 생각합니다. 우리는 오전 1시에 술취한 $ 5의 충동 구매에 대해 이야기하고 있으며 이메일 주소를 적어 놓으면 그 충동을 진정시킬 수 있습니다. –

+0

좋은 지적! 내가 저를 막지 않을 밴드를 좋아한다면 규칙보다는 예외가 될 수 있습니다. – Chuck

1

GUID로 가서 의심스러운 문자를 다른 문자로 바꿔야하는 이유는 무엇입니까? (0은 'h', 1은 'q'등)

3

글쎄, 이 실제로 사람이 읽을 수있게하려면 BubbleBabble을 사용할 수 있습니다. 그런 다음

#!/usr/bin/perl 
use Digest::BubbleBabble qw(bubblebabble); 
use Digest::SHA1 qw(sha1); 
print bubblebabble(Digest => sha1(join(' ', @ARGV))), "\n"; 

그것은 당신이 다음과 같은 출력을 얻을하고자하는 모든 명령 행 인수 공급 : 다음과 같이 펄 스크립트를 생성

xogan-nydut-zogiv-kotyn-ledah-taseb-gyhib-tucel-vudul-mykom-mexax 

또는 펄이 취향이 아니라면, 당신은 APG을 사용할 수 있습니다 '를 s의 발음 할 수있는 암호 모드 (also available online)이 같은 출력을 얻을 :

BedHiv 
cotsEub 
AvRabinn 
rarcUs 
TeuvVarn 
yuwats 

솔직히, 인간의 가독성이 수준은 과잉이다; RickNZ의 대답은 잘 작동 할 것이며 (우리가 소프트웨어 키에 대해했던 것과 거의 비슷합니다). 그러나 BubbleBabble은 재미 있습니다.

+0

확실히 재미 있습니다. 시간을내어 주셔서 감사합니다. –