답변:
현재 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@
:graph:
대신 사용해야 합니다 :print:
.</dev/urandom LC_ALL=C tr -dc '[:graph:]' | head -c 64
대신 고려하십시오
$ 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
다른 답변에서 제안한대로 사용하십시오 .
?
또는 ^
심각 할 너무 나쁘다.
[:print:]
클래스 에는 탭이 포함되어 있지 않습니다 . 그것은 단지입니다 [:alnum:]
+ [:punct:]
+ 공간 (단일 공간이 없습니다 [:space:]
).
이건 어떤가요
tr -dc [:print:] < /dev/urandom | head -c 64 | strings
문자열은 urandom의 출력을 인쇄 가능한 형식으로 인쇄해야합니다
-bash: /dev/urandom: Permission denied
/dev/random
암호를 생성하는 데 사용하는 이유가 있는지 모르겠지만 고통을 덜기 위해 pwgen을 사용하는 것이 좋습니다.
$ pwgen -s 10 1
여기서 10은 비밀번호 길이입니다.
#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 자 이상이어야합니다.