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


21

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

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

답변:


34

그것은 당신의 로케일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@

14
+1로 인해 유닉스 / 리눅스에서 약 30 년 동안 쉘을 사용하게되었으므로 stdin / stdout / stderr 리디렉션이 적용되는 명령 뒤에 위치 할 필요가 없다는 것을 알게되었습니다.
Anthon

이상한 로케일이 설정되어 있다면 주석은 ASCII가 아닌 경우에도 문자를 올바르게 인쇄 할 수 없어야합니까? 적어도 유능한 쉘 (물론 xterm 제외)?
오리온

2
@ orion : 쉘은 문자를 올바르게 인쇄합니다. 이 경우에는 tr 문제입니다. 인쇄 할 수 없다고 생각되는 바이트를 제거하여 결과를 이상하게 만듭니다.
cuonglm

@orion 균일 한 임의의 바이트 스트림은 일반적으로 올바르게 구성된 UTF-8 문자 인코딩 의 균일 한 임의의 스트림이 아닙니다 .
zwol

또한 암호에 어떤 공백이 없으면 다음 :graph:대신 사용해야 합니다 :print:.</dev/urandom LC_ALL=C tr -dc '[:graph:]' | head -c 64
edan

11

대신 고려하십시오

$ 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)를 제외하고 태양이 타 버립니다.


3

다른 사람들은 이미 로케일이 그 [: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다른 답변에서 제안한대로 사용하십시오 .


문제의 암호는 사람이 입력하지 않을 것입니다 (대신 Diceware를 사용하는 경우). 기본 시스템이 문제없이 특수 문자를 처리 할 수 ​​있다고 확신합니다. 어쨌든 고마워
Taymon

4
당신이 말하는 것은 완전히 잘못입니다. 사용자가 ASCII 문자, 숫자 및 밑줄 만 사용하도록하면 알파벳 크기가 상당히 줄어들어 공격자의 암호를 훨씬 쉽게 깰 수 있습니다. 도 처리 할 수있는 인증 시스템 ?또는 ^심각 할 너무 나쁘다.
Bakuriu

2
인증 시스템 또는 입력 필드가 일반 ASCII 기호로 질식되면 ... 잘못되어 내 개인 정보를 신뢰할 수 없습니다. 비밀번호에 공백을 포함한 모든 문자를 허용하지 않는 이유는 없습니다.
nzifnab

2
여기에 해당되는 것은 아니지만 사람이 입력 할 때 더 짧은 기호 뒤죽박죽보다 소유자에게 고유 한 의미를 갖는 긴 영숫자 암호를 기억하는 것이 훨씬 쉽습니다. 다양한 키보드에서 이러한 문자를 입력하는 문제가 있습니다 (모든 사람이 첫 번째 수준에 ^를 가지고 있지 않으며 대부분의 사람들은 백틱이 어디에 있는지 또는 무엇인지조차 모릅니다), 입력 상자는 탭 문자를 거의 확실하게 처리 할 수 ​​없습니다. 놀랍게도 수많은 웹 양식이 유효성 검사 오류, SQL 삽입 또는 불확실한 대소 문자 구분에 영향을 받기 쉽습니다.
오리온

1
참고 사항 : C 로케일 [:print:]클래스 에는 탭이 포함되어 있지 않습니다 . 그것은 단지입니다 [:alnum:]+ [:punct:]+ 공간 (단일 공간이 없습니다 [:space:] ).
jimmij

2

이건 어떤가요

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

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


이것은-bash: /dev/urandom: Permission denied
Anthon

죄송는 최고의 고양이 잊어
Blindstealer

2

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

$ pwgen -s 10 1

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

http://man.cx/pwgen


1
#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 자 이상이어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.