랜덤 패스워드 생성기

Random password generator

랜덤 패스워드 생성기는 랜덤 또는 의사 난수 생성기로부터 입력을 받아 자동으로 패스워드를 생성하는 소프트웨어 프로그램 또는 하드웨어 장치입니다.랜덤 패스워드는 주사위나 동전 등 간단한 랜덤 소스를 사용하여 수동으로 생성하거나 컴퓨터를 사용하여 생성할 수 있습니다.

인터넷에서 이용 가능한 "랜덤" 비밀번호 생성 프로그램의 예는 많지만 랜덤성을 생성하는 것은 까다로울 수 있으며 많은 프로그램이 강력한 보안을 보장하는 방식으로 랜덤 문자를 생성하지 않습니다.일반적으로 사용되는 방법의 품질을 독립적으로 확인할 수 있으므로 가능한 경우 오픈소스 보안 도구를 사용하는 것이 좋습니다.비밀번호를 무작위로 생성한다고 해서 비밀번호가 강력한 비밀번호가 되는 것은 아닙니다.이것은 추측하기 쉽거나 깨진 비밀번호를 생성할 가능성은 매우 낮기 때문입니다.사실, 비밀번호는 완전히 랜덤한 프로세스로 생성될 필요가 없습니다.추측하기 충분히 어렵기만 하면 됩니다.

암호 생성기는 암호 관리자의 일부일 수 있습니다.암호 정책이 복잡한 규칙을 적용하는 경우 암호를 수동으로 생성하는 것보다 해당 규칙 집합에 따라 암호 생성기를 사용하는 것이 더 쉬울 수 있습니다.

긴 문자열의 무작위 문자는 대부분의 사람들이 외우기 어렵다.니모닉 해시는 랜덤 문자열을 보다 기억에 남는 패스워드로 가역적으로 변환하여 기억하기 쉽게 합니다.해시는 컴퓨터에서 처리하여 원래 60비트 문자열을 복구할 수 있으므로 적어도 원래 문자열만큼 [1]많은 정보 내용을 가지고 있습니다.비슷한 기술이 기억 스포츠에서도 사용된다.

천진난만한 접근법

다음은 표준 프로그래밍 라이브러리에서 난수 생성기의 제한을 잘 모르는 프로그래머가 구현할 수 있는 두 가지 코드 샘플입니다.

C

# 포함하다 <time.h> # 포함하다 <stdio.h> # 포함하다 <stdlib.h>  인트 주된(무효) {     /* 비밀번호 길이 */     서명되어 있지 않다 짧다 인트 길이 = 8;      /* rand()의 시드 번호 */     srand(시랜드)((서명되어 있지 않다 인트) 시간을(0));      /* ASCII 문자 33 ~126 */     하는 동안에 (길이--) {         풋차(랜드() % 94 + 33);     }      인쇄물("\n");      돌아가다 종료_SUCCESS; } 

이 경우 의사 난수 발생기인 표준 C 함수 rand는 처음에는 C 함수 시간을 사용하여 시드되지만 이후 반복은 rand를 사용합니다.ANSI C 표준에 따르면 time_t 타입의 값이 반환됩니다.time_t는 구현 정의이지만 가장 일반적으로 1970년1월 1일 이후 현재 초수를 포함하는 32비트 정수입니다(유닉스 시간 참조).1년에 약 3,100만 초의 시간이 있기 때문에, 그 해(패스워드 정책에 의해서 패스워드의 빈번한 변경이 요구되는 상황에서의 간단한 문제)와 패스워드가 생성된 프로세스 ID를 알고 있는 공격자는, 암호 규격에 의해, 비교적 적은 수의 테스트 선택에 직면하게 됩니다.공격자가 암호가 생성된 시기를 더 정확하게 알 경우 테스트해야 할 대상자 수가 훨씬 적어지므로 이 구현에는 심각한 결함이 있습니다.

공격자가 암호화된 버전의 비밀번호를 얻을 수 있는 상황에서는 몇 백만 개의 트라이얼 비밀번호를 몇 초 만에 확인할 수 있을 정도로 빠르게 테스트를 수행할 수 있습니다.패스워드 크래킹을 참조해 주세요.

함수 랜드에 다른 문제가 발생.모든 의사 난수 생성기에는 내부 메모리 또는 상태가 있습니다.이 상태의 크기에 따라 생성할 수 있는 다양한 값의 최대 수가 결정됩니다.n비트 상태는 2 다른 값을 생성할 수 있습니다.많은 시스템에서 랜드는 31비트 또는 32비트 상태를 가지며 이는 이미 중대한 보안 제한입니다.Microsoft 의 문서에서는, C 표준 라이브러리 랜드의 Visual C++ 실장의 내부 상태에 대해서는 설명하고 있지 않습니다만,[2] 콜 마다 32767(15비트) 밖에 출력할 수 없습니다.Microsoft 에서는, 보다 시큐어한 다른 함수, rand_s 를 사용하는 것을 추천합니다.Microsoft에 따르면 rand_s의 출력은 암호화로 안전하며 srand 함수에 의해 로드된 시드는 사용하지 않습니다.그러나 프로그래밍 인터페이스는 [3]랜드와 다릅니다.

PHP

기능. pass_gen(인트 길이 = 8): 스트링 {     $pass = 배열();     위해서 (i달러 = 0; i달러 < > 길이; i달러++) {         $pass[] = 크르(mt_rand(32, 126));     }      돌아가다 파괴하다($pass); } 

두 번째 경우, PHP 함수[4] 마이크로타임이 사용되며, 마이크로초와 함께 현재 Unix 타임스탬프가 반환됩니다.이렇게 하면 가능성은 높아지지만, 예를 들어 직원이 작업을 시작한 날짜와 같이 암호가 생성된 시기를 정확하게 추측할 수 있는 사람은 여전히 검색 공간이 상당히 작습니다.또, 일부의 operating system에서는, 마이크로초의 해상도에 시간이 걸리지 않기 때문에, 선택의 폭이 큰폭으로 감소합니다.마지막으로 랜드[5] 함수는 일반적으로 기초가 되는 랜드 함수를 사용하며, 구현 방법에 따라서는 작은 상태 공간을 가질 수 있습니다.Mersenne Twister 의사 난수 생성기를 기반으로 하는 대체 난수 생성기 mt_rand는 PHP에서 사용할 수 있지만 32비트 상태이기도 합니다.강력한 난수 생성을 [6]PHP에 추가하는 제안이 있습니다.

보다 강력한 방법

강력하고 암호화적으로 안전한 랜덤 비밀번호를 생성하기 위해 다양한 방법이 있습니다.UNIX 플랫폼에서는 /dev/random 및 /dev/urandom이 프로그래밍 방식으로 또는 makepasswd와 [7]같은 프로그램과 함께 일반적으로 사용됩니다.Windows 프로그래머는 Cryptographic Application Programming Interface 함수 CryptGenRandom을 사용할 수 있습니다.Java 프로그래밍 언어에는 SecureRandom이라는 클래스가 포함되어 있습니다.또 다른 가능성은 사용자의 키보드 입력 타이밍과 같은 외부 현상을 측정하여 랜덤성을 유도하는 것입니다.

많은 컴퓨터 시스템에는 FIPS 181을 [8]구현하기 위한 응용 프로그램(일반적으로 "apg"라는 이름)이 이미 있습니다. FIPS 181(Automated Password Generator)은 (하드웨어 난수 생성기에서) 랜덤 비트를 다소 발음 가능한 [9]"워드"로 변환하는 표준 프로세스를 설명합니다.그러나 1994년에 FIPS 181 알고리즘에 대한 공격이 발견되어 공격자가 160만 개의 패스워드 검색 후 평균적으로 이 알고리즘에 기초한 패스워드를 가진 계정의 1%에 침입할 것으로 예상할 수 있게 되었습니다.이는 생성된 패스워드의 배포가 불균일하기 때문입니다.이것에 대처하려면 , 보다 긴 패스워드를 사용하거나 [10][11]알고리즘을 변경합니다.

배쉬

다음은 /dev/urandom을 사용하여 간단한 Bash 함수를 사용하여 암호를 생성하는 코드 샘플입니다.이 함수는 암호 길이를 매개 변수로 사용하거나 기본적으로 16을 사용합니다.

함수 mkpw() { LC_ALL=C tr -dc '[:graph:]' < /dev/urandom head -c ${1:-16}; 에코; }

자바

다음으로 SecureRandom을 사용하여 10개의 16진수 문자 비밀번호를 생성하는 코드샘플(클래스[12] PasswordGenerator에서 채택)을 나타냅니다.

[] 기호 = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 인트 길이 = 10; 랜덤 랜덤 = Secure Random.get Instance Strong();    // JDK 8에서는 강력한 것으로 알려진 SecureRandom 구현이 반환됩니다. String Builder 어떤 일을 맡다 = 신규 String Builder(길이); 위해서 (인트 i = 0; i < > 길이; i++) {     인트 랜덤 인덱스 = 랜덤.nextInt(기호.길이);     어떤 일을 맡다.추가하다(기호[랜덤 인덱스]); } 스트링 패스워드 = 어떤 일을 맡다.문자열(); 

자바스크립트

이 예에서는 Node.js Crypto 모듈을 사용하여 균일한 분포로 암호화된 안전한 난수를 생성합니다.

"엄격하게 사용";  컨스턴트 { 랜덤 입력 } = 요구하다("실패");  컨스턴트 시크릿 = (길이 = 64) => {   컨스턴트 대문자 = "ABCDEFGHIKLMNOPQRSTUVWXYZ";   컨스턴트 소문자 = "defghijklmnopqrstuvwxyz";   컨스턴트 숫자 = "0123456789";   컨스턴트 마이너스 = "-";   컨스턴트 밑줄 치다 = "_";   컨스턴트 스페셜 = "!\"#$%&'*+,/:;=?@\\^` ~";   컨스턴트 괄호 = [ [ ] { } ( < 。;   컨스턴트 모든. = 대문자 + 소문자 + 숫자 + 마이너스 + 밑줄 치다 + 스페셜 + 괄호;   허락하다 시크릿 = "";   위해서 (허락하다 색인 = 0; 색인 < > 길이; 색인++) 시크릿 += 모든..문자(랜덤 입력(모든..길이));   돌아가다 시크릿; }; 

다음 예에서는 Crypt를 사용합니다.랜덤:강력한 난수(플랫폼에 따라 다름)의 소스를 찾는 소스 모듈.

사용하다 암호:: 랜덤:원천 qw(get_strong);  하는 동안에(길이($out) < > 15) {     나의 $a = get_strong(1);     $a =~ s/[^[:그래프:]]//g;     $out .= $a; } 인쇄물 $out; 

파이썬

언어 Python은 Linux 및 macOS를 포함한 Unix 계열 시스템에서 /dev/urandom에서 암호화 등급 랜덤 비트를 가져오는 SystemRandom [13][14]클래스를 포함하고 있으며, Windows에서는 CryptGenRandom을 사용합니다.다음은 이 클래스의 사용을 보여주는 간단한 Python 스크립트입니다.

#!/usr/bin/env python3 수입품 랜덤, 스트링 마지 = 랜덤.시스템 랜덤() 길이 = 10 알파벳 = 스트링.ascii_문자 + 스트링.숫자 # a-z A-Z 0-9 패스워드 = "".합류하다(마지.선택.(알파벳) 위해서 _  범위(길이)) 인쇄물(패스워드) 

PHP

PHP 프로그램은 /dev/urandom(사용 가능한 경우)에서 열어서 읽거나 Microsoft [15]유틸리티를 호출할 수 있습니다.OpenSSL을 사용할 수 있는 경우 세 번째 옵션은 openssl_random_pseudo_bytes'[16] 함수를 사용하는 것입니다.

기계적인 방법

또 다른 방법은 주사위와 같은 물리적 장치를 사용하여 무작위성을 생성하는 것입니다.이를 위한 간단한 방법 중 하나는 6x6 문자 테이블을 사용합니다.첫 번째 다이롤은 테이블의 행을 선택하고 두 번째 다이롤은 열을 선택합니다.예를 들어, 2의 롤과 4의 롤은 아래의 [17]분류표에서 문자 "j"를 선택합니다.대/소문자 또는 일부 기호를 생성하려면 동전 플립을 사용할 수 있습니다(앞면 대문자, 뒷면 소문자).주사위 롤에서 숫자를 선택한 경우, 헤드코인 플립은 표준 키보드에서 숫자 위의 기호를 선택할 수 있습니다. 예를 들어, '4'가 아닌 '4' 위의 '

가 해당 기호입니다.

1 2 3 4 5 6
1 a b c d e f
2 g h i j k l
3 m n o p q r
4 s t u v w x
5 y z 0 1 2 3
6 4 5 6 7 8 9

생성된 비밀번호 유형 및 강도

랜덤 패스워드 생성기는 일반적으로 지정된 길이의 기호 문자열을 출력합니다.이러한 문자는 일부 문자 집합의 개별 문자, 발음 가능한 암호를 형성하도록 설계된 음절 또는 일부 단어 목록의 단어를 사용하여 암호를 구성할 수 있습니다.이 프로그램을 커스터마이즈하여 비밀번호가 로컬 비밀번호 정책에 적합하도록 할 수 있습니다.예를 들어 문자, 숫자 및 특수문자를 항상 조합하여 생성해야 합니다.이러한 정책은 기호가 더 이상 독립적으로 생성되지 않기 때문에 일반적으로 다음 공식보다 강도를 약간 낮춘다.

특정 공격에 대한 랜덤 패스워드의 패스워드 강도(브루트포스 검색)는 그것을 생성한 랜덤프로세스의 정보 엔트로피를 계산함으로써 계산할 수 있습니다.패스워드의 각 기호가 독립적으로 균일한 확률로 생성되는 경우, 비트 단위의 엔트로피는 다음 공식에 의해 주어진다.

여기서 N은 가능한 기호 수이고 L은 비밀번호 내의 기호 수입니다.함수2 로그는 base-2 로그입니다.H는 일반적으로 [18][19]비트 단위로 측정됩니다.

다른 기호 집합에 대한 기호당 엔트로피
기호 세트 기호 수 N 기호당 엔트로피 H
아라비아 숫자(0~9) (: PIN) 10 3.32비트
16진수(0~9, A~F) (예: WEP 키) 16 4.00 비트
대소문자를 구분하지 않는 라틴 알파벳(a~z 또는 A~Z) 26 4.70 비트
대소문자를 구분하지 않는 영숫자(a~z 또는 A~Z, 0~9) 36 5.17비트
대소문자를 구분하는 라틴 알파벳(a~z, A~Z) 52 5.70 비트
대소문자를 구분하는 영숫자(a~z, A~Z, 0~9) 62 5.95비트
모든 ASCII 인쇄 가능[a] 문자 94 6.55 비트
Diceware 단어 목록 7776 12.9 비트
N개의 심볼을 포함한 심볼 세트에 대해 원하는 패스워드 엔트로피 H를 달성하기 위해 필요한 진짜 랜덤으로 생성된 패스워드의 길이 L.
원하는 비밀번호 엔트로피 H 아라비아 숫자 16진수 대소문자를 구분하지 않음 라틴 문자 대소문자를 구분하지 않는 영숫자 대소문자를 구분하는 라틴 알파벳 대소문자를 구분하는 영숫자 모든 ASCII 인쇄 가능[a] 문자 인쇄 가능한 모든 확장 ASCII 문자 Diceware 단어 목록
32비트 10 8 7 7 6 6 5 5 3
40비트 13 10 9 8 8 7 7 6 4
64비트 20 16 14 13 12 11 10 9 5
80비트 25 20 18 16 15 14 13 11 7
96비트 29 24 21 19 17 17 15 13 8
128비트 39 32 28 25 23 22 20 17 10
160비트 49 40 35 31 29 27 25 21 13
192비트 58 48 41 38 34 33 30 25 15
224 비트 68 56 48 44 40 38 35 29 18
256 비트 78 64 55 50 45 43 40 33 20
384 비트 116 96 82 75 68 65 59 50 30
512 비트 155 128 109 100 90 86 79 66 40
1024비트 309 256 218 199 180 172 157 132 80
  1. ^ a b 공백 문자를 제외합니다.

임의의 패스워드 생성기는 사용되는 의사난수 생성기의 상태공간에 의해 제한된다.따라서 32비트 제너레이터를 사용하여 생성된 비밀번호는 비밀번호에 포함된 문자 수에 관계없이 32비트의 엔트로피로 제한됩니다.

다만, 상기의 계산으로 「매우 강한」패스워드에 대해서, 다른 타입의 공격이 성공할 가능성이 있는 것에 주의해 주세요.

암호 생성기 프로그램 및 웹 사이트

인터넷에서는 다수의 패스워드 생성 프로그램 및 웹사이트를 이용할 수 있습니다.그 품질은 다양하며 사용된 무작위성의 원천에 대한 명확한 설명이 없는 경우 및 클레임을 확인할 수 있는 소스 코드가 제공되지 않은 경우 평가하기가 어려울 수 있습니다.게다가 아마도 가장 중요한 것은 후보 패스워드를 인터넷을 통해 송신하는 경우, 특히 패스워드 생성 사이트의 프로그램에 대한 접속이 적절히 보호되지 않거나 사이트가 어떤 식으로든 손상되었을 경우, 명백한 보안상의 문제가 발생한다는 것입니다.안전한 채널이 없으면 특히 인터넷과 같은 공중 네트워크를 통한 도청을 막을 수 없습니다.이 문제에 대한 가능한 해결책은 JavaScript 등의 클라이언트 측 프로그래밍 언어를 사용하여 암호를 생성하는 것입니다.이 방법의 장점은 생성된 비밀번호가 클라이언트컴퓨터에 남아 외부 서버와의 사이에 전송되지 않는다는 것입니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Ghazvininejad, Marjan; Knight, Kevin (May–June 2015). "How to Memorize a Random 60-Bit String" (PDF). Proceedings of the 2015 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies. Vol. Proceedings of the 2015 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies. Denver, Colorado: Association for Computational Linguistics. pp. 1569–1575. doi:10.3115/v1/N15-1180. S2CID 8028691.
  2. ^ "RAND_MAX". docs.microsoft.com.
  3. ^ "Visual Studio 2005 Retired documentation". Microsoft Download Center.
  4. ^ "PHP: microtime – Manual". php.net.
  5. ^ "PHP: rand – Manual". php.net.
  6. ^ "Archived copy". Archived from the original on 2008-10-19. Retrieved 2008-10-17.{{cite web}}: CS1 maint: 제목으로 아카이브된 복사(링크)
  7. ^ "Linux / UNIX: Generating Random Password With mkpasswd / makepasswd / pwgen". cyberciti.biz. November 2007.
  8. ^ "StrongPasswords – Community Help Wiki". help.ubuntu.com. Retrieved 2016-03-25.
  9. ^ NIST. Automated Password Generator 표준
  10. ^ Shay, Richard; Kelley, Patrick Gage; Komanduri, Saranga; Mazurek, Michelle L.; Ur, Blase; Vidas, Timothy; Bauer, Lujo; Christin, Nicolas; Cranor, Lorrie Faith (2012). Correct horse battery staple: Exploring the usability of system-assigned passphrases (PDF). SOUPS '12 Proceedings of the Eighth Symposium on Usable Privacy and Security. doi:10.1145/2335356.2335366.
  11. ^ Ganesan, Ravi; Davies, Chris (1994). "A New Attack on Random Pronounceable Password Generators" (PDF). Proceedings of the 17th {NIST}-{NCSC} National Computer Security Conference. NIST: 184–197. Retrieved 2014-12-17.
  12. ^ "Rate my random password generator!". Crypto.
  13. ^ "9.6. random — Generate pseudo-random numbers — Python 3.5.1 documentation". docs.python.org. Retrieved 2016-03-25.
  14. ^ "16.1. os — Miscellaneous operating system interfaces — Python 3.5.1 documentation". docs.python.org. Retrieved 2016-03-25.
  15. ^ ""Secure" Random Numbers in PHP". What the Daily WTF?. April 18, 2010.
  16. ^ "PHP: openssl_random_pseudo_bytes – Manual". php.net. Retrieved 2016-03-25.
  17. ^ Levine, John R., Ed:인터넷 비밀, 제2판, 831쪽 ff.존 와일리와 아들들.
  18. ^ Schneier, B: Applied Cryptography, 제2판, 233쪽 ff.존 와일리와 아들들.
  19. ^ Burr, W. E.; Dodson, D. F.; Polk, W. T. (2006). "Electronic Authentication Guideline" (PDF). NIST. doi:10.6028/NIST.SP.800-63v1.0.2. {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)

외부 링크