임의의 비밀번호를 생성하고 다음을 수행하고 싶습니다.
</dev/urandom tr -dc [:print:] | head -c 64
Ubuntu를 실행하는 내 노트북에서는 예상대로 인쇄 가능한 문자만 생성됩니다. 그러나 학교 서버(Red Hat Enterprise Linux 실행)에 SSH로 접속하여 실행하면 비슷한 결과가 나오며 3!ri�b�GrӴ��1�H�<�oM����&�nMC[�Pb�|L%MP�����9��fL2q���IFmsd|l�K
전혀 작동하지 않습니다. 여기서 무엇이 잘못될 수 있나요?
답변1
지금,GNU TR단일 바이트 문자만 완전히 지원됩니다. 따라서 멀티바이트 인코딩을 사용하는 로케일에서는 출력이 이상하게 보일 수 있습니다.
$ </dev/urandom LC_ALL=vi_VN.tcvn tr -dc '[:print:]' | head -c 64
`�pv���Z����c�ox"�O���%�YR��F�>��췔��ovȪ������^,<H ���>
쉘은 멀티바이트 문자를 올바르게 인쇄하지만 GNU는 tr
인쇄할 수 없는 것으로 간주되는 바이트를 제거합니다.
안정적으로 사용하려면 로케일을 설정해야 합니다.
$ </dev/urandom LC_ALL=C tr -dc '[:print:]' | head -c 64
RSmuiFH+537z+iY4ySz`{Pv6mJg::RB;/-2^{QnKkImpGuMSq92D(6N8QF?Y9Co@
답변2
그것에 대해 생각해보세요
$ dd if=/dev/urandom bs=48 count=1 status=none | base64
imW/X60Sk9TQzl+mdS5PL7sfMy9k/qFBWWkzZjbYJttREsYpzIguWr/uRIhyisR7
여기에는 두 가지 장점이 있습니다.
~8KB가 아닌 임의 장치에서 48바이트만 읽습니다. 동일한 호스트의 다른 프로세스에 임의 숫자가 필요한 경우 한 번에 최대 8KB를 사용하면 심각한 문제가 될 수 있습니다. (그렇습니다. 누구도 사용해서는 안 된다고 주장할 수도 있습니다.차단하다무작위 장비이지만 사람하다.)
의 출력에는
base64
특별한 의미를 지닌 문자가 거의 포함되어 있지 않습니다. (전혀 그렇지 않은 경우| tr +/ -_
끝에 추가하고 (예에서와 같이) 바이트 수를 확인하십시오.입력하다to는base64
3의 배수이다. )
이런 방식으로 생성된 비밀번호는 정확히 384비트의 엔트로피를 갖습니다.일부현재 수행 중인 작업(log 2 96 64 ≒ 421.4)보다 적지만 대부분의 목적에 충분합니다(256비트의 엔트로피는 "태양이 언제 소진될지 추측 중"인 범위에 안전하게 속함)와는 별개로내가 아는 한 RSA 키의 경우).
답변3
[:print:]
다른 사람들은 로캘이 의미를 결정한다고 지적했습니다 . 그러나 인쇄 가능한 모든 문자가 비밀번호로 적합한 것은 아닙니다(ASCII에서도 마찬가지). 공백, 탭 및 #$%^이 정말로 필요하지 않습니까? 비밀번호에 - 기억하기 어려울 뿐만 아니라 기본 인증 시스템에 잠재적으로 위험할 수도 있고 입력 필드에 입력하지 못할 수도 있습니다. 이 경우 "일반" 문자를 수동으로 선택해야 합니다.
LC_ALL=C </dev/urandom tr -dc '[:alnum:]_' | head -c 64
아니면 단순히
</dev/urandom tr -dc 'A-Za-z0-9_' | head -c 64
또는 더 나은 방법은 base64
다른 답변에서 제안한 대로 사용하는 것입니다.
답변4
비밀번호를 생성하기 위해 이를 사용할 이유가 있는지는 모르겠지만 /dev/random
, 고통을 덜기 위해 pwgen을 사용하는 것이 좋습니다.
$ pwgen -s 10 1
여기서 10은 비밀번호 길이입니다.