랜덤 패스워드 생성기
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' 위의 '