2009-03-24 3 views
3

임의의 인간 친화적 인 코드를 생성하는 방법을 연구하고 있지만 (쉽게) 추측 할 수는 없습니다. 이것은 상품을 포기할 때 사용됩니다 (고유 할인 코드를 생각하십시오). 우리는 약 50k를 생성해야합니다. 이를 수행하기위한 표준 방법/알고리즘이 있습니까? GUID를 사용하고 CRC를 적용 할 생각이었습니다. 이것은 나쁜 생각입니까?사용자 친화적 코드 생성

.netframework 3.5를 사용하는 것이 중요합니다.

답변

1

나는 이런 종류의 것을하기 전에 Base32을 사용했다.

당신은 단지 등 O, I, L, 1, 0과 같은 귀찮은 문자를 방지 알파벳,

편집 필요

: 그래서, 단지 Base32는 당신에게 줄만큼 무작위로 생성 된 바이트 인코딩, 명확히하기를 필요한 문자 수

그러면 인간의 판독 가능성을 높이기 위해 결과를 4 개의 그룹으로 나누는 것이 좋습니다.

편집 2 : 또 다른 좋은 아이디어는 마지막 문자 체크 자리 수 있도록하는 것입니다 - 이전의 모든 바이트의 합계가 MD5에서 비트를 복용하여 32

+0

thx, Base32에게 기회를 제공 할 것입니다. –

+0

** ** 참고 : https://stackoverflow.com/questions/6761898 – dreftymac

6

내가 생성 한 인간 친화적 인 체크섬을 모듈로 말한다 체크섬을 만들고이를 단어 목록에 색인으로 사용합니다. 예를 들면 :는

: [email protected] 7012 ; md5words /home/nr/.profile 
overextend moonscape cucumbers outsmarting 

코드는 모든 시스템에서 동일한 결과를 생성하도록 스크립트에 포함되어있는 단어 목록을 계산하지 루아의 40 행이다.


편집 : 응용 프로그램에서

, 당신은 50,000 키를 생성합니다. 당신은 이런 식으로 그것을 할 수 있습니다 : 단어 목록이 거의 10 만 단어에있다 :이 키는 위조하기 어려운

Chisinau Phaethon customs Martina 
commensurate freewill logical cambered 
kamikazes Creighton Dobro's Alonzo 
medallion's jesters goofy keystones 
Anaxagoras martial Medina's Hon's 
acclimatized chirping Cleopatra's mascaras 
buoyant nuclear lumbering disagreements 
dampens Philby cloak drollness 

: 다른 비밀 문구이 절차를 사용

for ((i=1; i<=50000; i++)) 
do 
    echo "this is my secret phrase $i" | md5words 
done 

이러한 키를 생성 그래서 10^20 개의 가능한 4 단어 시퀀스가 ​​있습니다. 코드가 100,000 개이면 코드를 임의로 추측 할 수있는 기회가 10^15에 하나입니다. 사람이 시도 할 수있는 키 수에 스로틀을 넣으면 0.3 초마다 하나의 키를 말하면 문제가 없습니다.

이 아이디어를 응용 프로그램에 배포하는 경우 단어 목록을 짧게, 매우 일반적으로 인식되는 10,000 단어로 정리할 것입니다. 10^4의 계수를 잃어 버린 후에도 숫자는 크게 유리합니다. 열쇠를 추측 할 수있는 기회는 1000 억에 1입니다.


UPDATE은 : 2011 년 8 월이 기술은 xkcd cartoon의 대상이었다.

+0

약 50,000 개의 코드를 생성해야합니다. 단어 목록을 사용하면 코드를 추측하기가 쉽지 않을까요? 어쩌면 당신의 접근 방식을 이해하지 못할 수도 있습니다. 고마워. –

+0

단어의 순서를 생성 할 때 쉽게 추측하기 어려운 시퀀스를 쉽게 만들 수 있음을 보여주기 위해 제 대답을 확장했습니다. –

+1

P. 시퀀스의 다음 키를 추측 할 수있는 사람에게 명성 100 점을 제공 할 것입니다. –

2

마음에 도약 아이디어의 몇 :

  • 길이 허용하는 경우, 당신은 항상 사전에서 단어를 선택하여 문장을 생성 할 수 있습니다.이에 대한 좋은 예는 Diceware을 참조하십시오.

  • 길이가 더 중요한 경우 음절 목록을 사용하면 결과는 말도되지만 발음할만한 단어가됩니다. 그러나 원하지 않는 실제 단어를 제거하기 위해 결과를 필터링해야 할 수도 있습니다.

  • 발음 가능은 필요하지 않지만 시스템에서 오는 코드를 신속하게 확인할 수 있기를 원할 경우 바이트 배열로 압축되고 (코드 번호 : base64 또는 그와 비슷한) 작은 CRC가 사용됩니다. 작동 할 것이다. 코드를 짧게 유지하고 유사한 문자를 제거하는 인코딩을 선택하면 (즉, 'O', 'O', '0'및 'Q'가 모두 표에 없음) 인적 요소를 개선 할 수 있습니다.

  • 실제로 코드가 약 5 자 이상이어야하는 경우 코드를 청크로 나누는 표준 구두점 스키마를 채택하는 것이 좋습니다. "A236re8ww1jkm"는 "A236-re8wM-1jkz"보다 읽고 쓰는 것이 훨씬 어렵습니다. 여기서 다섯 번째는 야생의 추측입니다 ... 아마도 가장 좋은 길이의 문학이있을 것입니다.

  • 실제로이 암호를 질문하는 경우 (즉,이 코드를 위조 할 때 중요한 유의미한 가치가있는 경우) 암호 전문가가 최상의 방법으로 답변을 받으면 궁극적으로 슬픔을 느끼게됩니다.

3

인간 친화적이고 발음 가능하지만 궁극적으로 의미가 없으며 임의의 단어를 만드는 가장 좋아하는 방법은 마르코프 체인입니다. 이 경로를 따라 당신을 도울 수있는 몇 가지 링크가 있습니다.

http://www.codinghorror.com/blog/archives/001132.html - (! 아주 좋은) 제프 앳 우드의 설명

http://en.wikipedia.org/wiki/Markov_chain - 마르코프 체인에 대한 위키 백과의 항목이 긴이며, 수학을 통해 이동합니다.

http://www.cs.bell-labs.com/cm/cs/pearls/sec153.html - Programming Pearls에서 Perl은 Markov 체인 생성기를 사용합니다.

http://www.xradiograph.com/WordSalad/ChainsOfLove - 마르코프 체인 생성기에 대한 링크가 있습니다.

http://www.jwz.org/dadadodo/ - C.

에서 제이미 자윈 스키의 구현

그리고 당신은 그것은 그들을 밖으로 단어와 문장을 생성하는 것, 체인을 만들기 위해 이러한 발전기에게 텍스트를 공급한다는 것을 기억하십시오.

+0

나는 이것이 주어질 수있는 작은 코드들을 어떻게 만들어 낼지 모르겠습니다. –

+0

http://www.fourteenminutes.com/fun/words/index.cgi에서 말하고있는 것처럼 단어 생성기를 참조하십시오.이 코드를 작은 코드로 사용할 수 있습니다.이 코드는 임의의 문자로 구성된 문자열보다 더 기억에 남습니다 (원하는 코드 인 경우). –

+0

ok thx, 그것을 확인할 것입니다 –

2

Java Pronouncable Passwords은 임의의 발음 가능한 단어를 생성하는 사이트입니다. 소스를 사용할 수 있으므로 필요한 모든 시스템에이 소스를 포팅 할 수 있습니다.

사용자에게 제공 할 수있는 코드를 제공해야하며, 실제로 코드를 기억할 수있는 코드를 제공해야합니다.

+0

thx가 체크 아웃합니다. –