/ dev / random에서 읽어도 데이터가 생성되지 않습니다


19

나는 종종 명령을 사용

cat /dev/urandom | strings --bytes 1 | tr -d '\n\t ' | head --bytes 32

의사 랜덤 암호를 생성합니다. 이 기능은 작동하지 않습니다 /dev/random.

구체적으로 특별히

  • cat /dev/urandom | strings --bytes 1 | tr -d '\n\t ' 출력을 생성
  • cat /dev/random | strings --bytes 1 출력을 생성
  • cat /dev/random | strings --bytes 1 | tr -d '\n\t ' 출력을 생성 하지 않습니다

주의 : /dev/random엔트로피를 생성하려면 마우스를 흔들거나 키 (예 : Ctrl, Shift 등)를 눌러야 할 수 있습니다.

마지막 예가 작동하지 않는 이유는 무엇입니까? 않는 tr것이 큰 내부 버퍼의 일종 /dev/urandom빨리 채우기 만은 /dev/random하지 않습니다?

PS CentOS 6.5를 사용하고 있습니다

cat /proc/version
Linux version 2.6.32-431.3.1.el6.x86_64 (mockbuild@c6b10.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Jan 3 21:39:27 UTC 2014

배포판, 커널 버전은 무엇입니까? Cygwin에서 두 값을 모두 반환합니다.
Kiwy

@Kiwy 편집을보십시오.
Aaron J Lang

1
당신은 pwgen특히 알고 pwgen -s있습니까?
MvG

2
-s스위치는 더 진정으로 무작위, 그들이 적은 기억에 남는 있습니다. @Boyd : makepasswd 가 데비안 기반 배포판을 넘어 광범위하게 제공됩니까? 내가 본대로 pwgen은 CentOS에서 사용할 수 있지만 makepasswd는 아닙니다 .
MvG

1
짤방 백업 봇 나는 @ MVG 그와 함께 동의 makepasswd어쨌든, 내 플랫폼에서 사용할 수 없습니다 감사합니다
아론 J 랭에게

답변:


27

결국에.

에:

cat /dev/random | strings --bytes 1 | tr -d '\n\t '

cat 버퍼링하지는 않지만 어쨌든 여기에 연결할 것이 없기 때문에 불필요합니다.

< /dev/random strings --bytes 1 | tr -d '\n\t '

strings그러나 출력이 더 이상 아니기 때문에 터미널은 출력이 터미널로 갈 때 라인 과 달리 블록 (4 또는 8kB와 같은)으로 출력을 버퍼링합니다 .

따라서 출력 할 4kB 상당의 문자가 누적되면 stdout에 쓰기 시작하기 때문에 시간이 오래 /dev/random걸립니다.

tr출력은 터미널로갑니다 (터미널의 쉘 프롬프트에서 실행하는 경우). 출력을 라인 단위로 버퍼링합니다. 를 제거하기 때문에 \n전체 줄을 쓸 수 없으므로 전체 블록이 누적되는 즉시 출력됩니다 (출력이 터미널로 이동하지 않을 때와 같이).

따라서 8kB (아마도 2 블록 이상)의 데이터를 쓸 정도로 충분히 읽을 tr때까지 아무것도 쓰지 않을 것입니다 (첫 번째 블록에는 개행 문자 또는 탭 또는 공백 문자가 포함될 수 있으므로).strings/dev/random

이 시스템 에서이 작업을 시도하면 /dev/random12MiB on과는 달리 초당 평균 3 바이트를 얻을 수 /dev/urandom있으므로 최상의 시나리오 (처음 4096 바이트 /dev/random는 모두 인쇄 가능한 것)입니다. 22 분 전에 얘기 tr하면 아무 것도 출력되지 않습니다. 그러나 시간이 더 걸릴 것입니다 (빠른 테스트에서 strings1 ~ 2 블록마다 블록을 읽는 것을 볼 수 있으며 출력 블록에는 줄 바꿈 문자의 약 30 %가 포함되어 있으므로 읽을 필요가 있습니다. 최소 3 개의 블록 tr은 4096자를 출력해야합니다.

이를 피하기 위해 다음을 수행 할 수 있습니다.

< /dev/random stdbuf -o0 strings --bytes 1 | stdbuf -o0 tr -d '\n\t '

stdbuf LD_PRELOAD 트릭을 통해 명령의 stdio 버퍼링을 변경하는 GNU 명령 (일부 BSD에서도 있음)입니다.

대신 탭, 개행 및 공백을 제외시키는을 strings사용할 수 있습니다 tr -cd '[:graph:]'.

CUTF-8 문자로 인해 예상치 못한 상황 이 발생하지 않도록 로케일을 수정하고 싶을 수도 있습니다 .


와우 인상적인 설명.
Kiwy

2
놀랄 만한! 훌륭한 설명과 해결책. cat파이프 라인 끝에서 stdin을 리디렉션하는 것을 좋아하지 않기 때문에 항상 '무용지물'을 사용 했습니다. 이제 '프로세스를 저장'하고 여전히 읽을 수있는 명령을 가질 수 있습니다. 내 최종 솔루션이었다< /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32
아론 J 랭

@AaronJLang, 좋은 지적 [:graph:]. 나는 그것에 대해 잊었다.
Stéphane Chazelas

@AaronJLang, 데이터를 가져 오자마자 데이터를 쓰도록 허용하지 않는 한 stdbuffor를 필요 로 head -c32하지 않는 한 (예 : 32 바이트 청크 대신 여러 청크에서 데이터를 가져 오는 즉시)
Stéphane Chazelas

2
제 생각에는 / dev / urandom은 저자가 사용하기에 충분합니다. 누군가가 랜덤과 비교하여 urandom이 어떻게 작동하는지 궁금하다면, 커널 소스 트리의 drivers / char / random.c에서 드라이버 상단의 주석을 읽는 것이 좋습니다. 의견은 PRNG의 분석과 구현에 대해 언급합니다. 이 논문이 "무작위와 비교하여 우라늄이 얼마나 랜덤 한가?"라는 질문에 답하기를 바랍니다. 여기 가능 : eprint.iacr.org/2012/251.pdf
etherfish

5

많은 보안 응용 프로그램에서 난수를 생성하려면 충분한 엔트로피가 필요합니다. 엔트로피는 임의성이 예측할 수없는 정도를 측정합니다. 결정 론적 프로세서는 엔트로피를 생성 할 수 없으므로 엔트로피는 비결정론 적 동작이있는 하드웨어 구성 요소 또는 사용자 동작 타이밍 (마우스 흔들기)과 같이 재현하기 어려운 다른 요소에서 외부에서 가져와야합니다. 들어 온다). 충분한 엔트로피를 사용할 수있게되면 암호화를 사용하여 거의 무제한의 난수 스트림을 생성 할 수 있습니다.

리눅스는 다음을 통해 모두 허용 난수를 생성하는 암호화를 사용하여 풀에서 엔트로피를 축적하여 작동 /dev/random하고 /dev/urandom. 차이점은 /dev/random매우 보수적 인 엔트로피 계산 을 적용하여 풀에서 생성되는 모든 바이트에 대해 풀의 엔트로피 추정값을 낮추는 반면 /dev/urandom풀의 엔트로피 양과는 관련이 없습니다.

풀의 엔트로피 추정치가 너무 낮 으면 /dev/random더 많은 엔트로피가 누적 될 때까지 차단됩니다. 이로 인해 /dev/random생산량 이 발생할 수있는 속도가 심각하게 손상 될 수 있습니다. 이것이 당신이 여기서 관찰하고있는 것입니다. 그것은 아무 상관이 없다 tr; 그러나 strings버퍼링으로 출력을 읽으므로 /dev/random최소한 1 바이트의 입력을 생성하기 위해 전체 버퍼 (몇 KB)를 읽어야합니다 .

/dev/urandom엔트로피가 실제로 인식 가능한 방식으로 감소하지 않기 때문에 암호화 키 생성에 완벽하게 허용됩니다 . (유니버스가 존재했던 것보다 오랫동안 컴퓨터를 계속 실행하면 이러한 고려 사항을 무시할 수 없지만 그렇지 않으면 좋습니다.) 좋지 않은 경우는 단 하나뿐입니다. /dev/urandom새로 설치 한 시스템에는 있습니다. 아직 엔트로피를 생성 할 시간이 없었거나, 읽기 전용 미디어로 부팅하는 새로 부팅 된 시스템입니다.

strings부트 체인에서 제거 하면 프로세스 속도가 빨라질 수 있습니다. 아래 tr는 비 인쇄 문자를 필터링합니다.

</dev/random LC_ALL=C tr -dc '!-~'

그러나 충분한 엔트로피를 축적 할 시간이없는 시스템에서 비밀번호를 생성하지 않도록주의 하는 한 /dev/urandomhere 를 사용할 수 있습니다 . 리눅스 엔트로피 풀의 레벨을 확인할 수 있습니다 /proc/sys/kernel/random/entropy_avail(를 사용하면 /dev/random이 파일의 그림은 매우 보수적입니다).


1

당신은 사용해야하는 /dev/urandom고품질의 (의사) 난수를 얻기 위해, 그리고 /dev/random당신은 절대적으로 정말 예측할 수없는 임의의 숫자를 필요로하는 경우에만. NSA의 자원 아래에있는 공격자는 크랙하기 가 매우 어렵습니다 /dev/urandom( 고무 호스 암호 법도 잊지 마십시오 ). 커널은 "실제로 임의의"바이트로 버퍼를 채 웁니다 /dev/random. 슬프게도 그 생성되는 속도가 너무에서 많은 것을 읽고, 낮은 /dev/random 임의성을 기다리고 스톨.

random.org 또는 그 암호 생성기 또는 떠 다니는 많은 임의의 암호 생성기 중 하나를 사용하는 것을 고려할 수 있습니다. 예를 들어이 페이지 에서 몇 가지 명령 줄 팁을 살펴보십시오 (모두 권장하지는 않습니다) , 그러나 그들은 당신에게 아이디어를 주어야합니다. 또는 당신은 mkpasswd(1)(여기 Fedora 19 part expect-5.45-8.fc19.x86_64) 와 같은 것을 사용할 수 있습니다 .

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