[unix] 임의의 비밀번호 생성 왜 휴대용이 아닌가?

임의의 비밀번호를 생성하고 싶습니다.

</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못합니다. 여기서 무엇이 잘못 될 수 있습니까?



답변

그것은 당신의 로케일TR 문제.

현재 GNU tr 은 1 바이트 문자 만 완전히 지원합니다. 따라서 멀티 바이트 인코딩을 사용하는 로케일에서 출력이 이상 할 수 있습니다.

$ </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@


답변

대신 고려하십시오

$ dd if=/dev/urandom bs=48 count=1 status=none | base64
imW/X60Sk9TQzl+mdS5PL7sfMy9k/qFBWWkzZjbYJttREsYpzIguWr/uRIhyisR7

여기에는 두 가지 장점이 있습니다.

  • ~ 8KB가 아닌 임의 장치에서 48 바이트 만 읽습니다. 동일한 호스트의 다른 프로세스에 임의의 숫자가 필요한 경우 한 번에 8KB를 모두 소모하면 심각한 문제가 될 수 있습니다. (예, 아무도 차단 장치를 사용해서는 안되지만 사람들 은 사용 합니다.)

  • 의 출력 base64에는 특별한 의미를 가진 문자가 거의 없습니다. (아무도도 | tr +/ -_, 끝에 압정 을 입력하고 (예에서와 같이) 입력 되는 바이트 base64수는 3의 배수 인지 확인하십시오.

이 방법으로 생성 된 암호는 정확히 384 비트의 엔트로피를 가지며, 이는 현재 수행 한 것보다 약간 적지 만 (log 2 96 64 ≈ 421.4) 대부분의 목적에는 충분합니다 (256 비트의 엔트로피는 “여전히 추측 할 때 RSA 키 (AFAIK)를 제외하고 태양이 타 버립니다.


답변

다른 사람들은 이미 로케일이 그 [:print:]의미를 결정한다고 지적했습니다 . 그러나 모든 인쇄 가능한 문자가 암호에 적합하지는 않습니다 (아스키에서도). 공백, 탭 및 # $ % ^을 정말로 원하지 않습니까? 암호에-기억하기 어렵고 기본 인증 시스템에 잠재적으로 위험하며 입력 필드에 입력하는 것이 불가능할 수도 있습니다. 이 경우 “sane”문자를 수동으로 선택해야합니다.

LC_ALL=C </dev/urandom tr -dc '[:alnum:]_' | head -c 64

또는 단순히

</dev/urandom tr -dc 'A-Za-z0-9_' | head -c 64

또는 base64다른 답변에서 제안한대로 사용하십시오 .


답변

이건 어떤가요

tr -dc [:print:] < /dev/urandom | head -c 64 | strings

문자열은 urandom의 출력을 인쇄 가능한 형식으로 인쇄해야합니다


답변

/dev/random암호를 생성하는 데 사용하는 이유가 있는지 모르겠지만 고통을 덜기 위해 pwgen을 사용하는 것이 좋습니다.

$ pwgen -s 10 1

여기서 10은 비밀번호 길이입니다.

http://man.cx/pwgen


답변

#Chars allowed in password (I don't like l,o,O, etc):
P="0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz"

#Or such:
#P="a-zA-Z0-9"

head -c 8 < /dev/urandom | tr '\000-\377' "$P$P$P$P$P"
echo

이 방법 IMHO는 / dev / urandom에서 데이터를 사용할 때 더 똑똑합니다. $ P $ P $ P …로 붙여 넣은 문자열의 길이는 256 자 이상이어야합니다.


답변