난수 생성을위한 가장 안전한 시드는 무엇입니까?
난수 생성기를 시드하는 가장 안전한 엔트로피 소스는 무엇입니까? 이 질문은 언어 및 플랫폼에 독립적이며 네트워크의 모든 시스템에 적용됩니다. 이상적으로는 클라우드 환경의 컴퓨터 또는 호스팅 회사에서 제공하는 서버에서 사용할 수있는 소스를 찾고 있습니다.
명심해야 할 두 가지 중요한 약점이 있습니다. 난수 생성기를 보내는 데 시간을 사용하는 것은 CWE-337 위반입니다 . 작은 시드 공간을 사용하면 CWE-339를 위반하게 됩니다.
여기에 몇 가지 생각이 있습니다. 참을성이 없으면 끝으로 건너 뛰십시오.
1. 보안 시드 란 무엇입니까?
보안은 공격 모델에 대해서만 상대적으로 정의됩니다. 우리는 여기에 일련의 원하는 n 개의 이 비트, n은 일반 즉, 가능한 모든 것을 : 공격자에 관해서 엔트로피의 비트 2 개 N 그 순서 값은보기의 공격자 점에서 똑같이 가능성이됩니다.
이것은 공격자가 사용할 수 있는 정보 와 관련된 모델입니다 . 시드 (일반적으로 PRNG에서)를 생성하고 사용하는 애플리케이션은 정확한 시드를 알고 있습니다. 종자가 "안전한지"여부는 종자 또는 종자 생성 과정의 절대적 속성이 아닙니다. 중요한 것은 공격자가 생성 프로세스에 대해 가지고있는 정보의 양입니다. 이 정보 수준은 상황에 따라 크게 다릅니다. 예를 들어, 다중 사용자 시스템 (예 : 하드웨어 적용 애플리케이션 분리가있는 Unix 유사)에서 정확한 메모리 액세스 타이밍은 명목상 보호되는 프로세스가 메모리를 읽는 방법에 대한 정보를 나타낼 수 있습니다. 원격 공격자도 이러한 정보를 얻을 수 있습니다. 이것은 입증 되었습니다 (실험실 조건에서) AES 암호화 (일반적인 AES 구현은 키에 의존하는 액세스 패턴이있는 내부 테이블을 사용합니다. 공격자는 캐시 미스를 강제하고 서버 응답의 정확한 타이밍을 통해이를 감지합니다).
종자 수명을 고려해야합니다. 시드는 공격자에게 알려지지 않은 한 안전합니다. 이 속성은 나중에 참이어야합니다. 특히, 후속 PRNG 출력의 발췌에서 시드를 복구하는 것은 불가능합니다. 이상적으로는 어떤 시점에서 완전한 PRNG 상태를 얻는 것조차도 PRNG가 미리 생성 한 비트에 대한 단서를 제공해서는 안됩니다.
여기서 제가 말씀 드리고 싶은 점은 시드가 보안을 유지할 수있는 컨텍스트에서 사용되는 경우에만 "안전"하다는 것입니다. 이는 다소간 암호화 보안 PRNG 및 일부 변조 방지 스토리지를 의미합니다. 이러한 스토리지를 사용할 수있는 경우 가장 안전한 시드는 오래 전에 한 번 생성 되어 변조 방지 하드웨어에서 호스팅하는 보안 PRNG에서 사용 된 시드입니다 .
안타깝게도 이러한 하드웨어는 비싸고 (HSM이라고하며 수백 또는 수천 달러의 비용이 듭니다) 일반적으로 그 비용은 정당화하기 어렵습니다 (잘못된 시드는 시스템 작동을 방해하지 않습니다. 이것은 테스트 불가능의 일반적인 문제입니다.) 보안). 따라서 "대부분 소프트웨어"솔루션을 선택하는 것이 일반적입니다. 소프트웨어는 장기적인 기밀 저장을 제공하는 데 적합하지 않기 때문에 시드 수명이 임의로 단축됩니다. 새 시드가 주기적으로 획득됩니다. 에서 포르투나 , 같은 시드가 생성 된 의사 난수 데이터의 모든 메가 바이트 번 이상 일어날 예정이다.
요약하자면, HSM이없는 설정에서 보안 시드는 공격자가 수집 할 수없는 데이터를 사용하여 비교적 쉽게 얻을 수있는 시드입니다.
2. 혼합
랜덤 데이터 소스는 좋은 균일 비트를 생성하지 않습니다 (각 비트는 정확히 0.5 확률로 값 1을 가지며 비트 값은 서로 독립적입니다). 대신, 무작위 소스는 소스 별 세트에서 값을 생성합니다. 이러한 값은 비트 시퀀스로 인코딩 할 수 있지만 돈의 가치는 없습니다. n 비트의 엔트로피를 가지려면 인코딩 할 때 n 비트 보다 훨씬 더 많은 값을 사용해야합니다 .
여기에서 사용할 암호화 도구 는 임의 길이의 입력을 받아들이고 n 비트 출력을 생성하는 PRF 입니다 . 이러한 종류의 암호화 보안 PRF는 임의의 오라클 로 모델링됩니다 . 간단히 말해서 주어진 입력에 대해 시도하지 않고 오라클 출력에 대해 예측하는 것은 계산적으로 실현 가능하지 않습니다.
지금은 해시 함수가 있습니다. 해시 함수는 몇 가지 보안 속성, 즉 사전 이미지, 두 번째 사전 이미지 및 충돌에 대한 저항을 충족해야합니다. 우리는 일반적으로 해시 함수가 무작위 오라클 모델에서 어떻게 벗어나는지 확인하여 분석합니다. 여기에 중요한 점이 있습니다. 랜덤 오라클 모델을 따르는 PRF는 좋은 해시 함수가 될 수 있지만 그럼에도 불구하고 랜덤 오라클과 구별하기 쉬운 좋은 해시 함수 (사전 이미지 및 충돌에 대한 저항의 의미에서)가있을 수 있습니다. . 특히, SHA-2 함수 (SHA-256, SHA-512 ...) 안전한 것으로 간주되지만, 임의 신탁 모델에서 기인 "길이 연장 공격」(소정에 출발 H (m)은 , 그 것이다 h (m || m ') 계산 가능일부 제한된 메시지에 대한 m ' 몰라도 m ). 길이 확장 공격은 사전 이미지 또는 충돌 생성에 대한 지름길을 제공하지 않는 것 같지만 이러한 해시 함수가 임의의 오라클이 아님을 보여줍니다. 를 들어 SHA-3 대회 , NIST는 후보는 "길이 확장을"허용해서는 안 말했다.
따라서 혼합 단계는 쉽지 않습니다. 가장 좋은 방법은 지금도 SHA-256 또는 SHA-512를 사용하고 선택시 SHA-3으로 전환하는 것입니다 (2012 년 중반 쯤에 발생해야 함).
3. 출처
컴퓨터는 결정 론적 기계입니다. 임의성을 얻으려면 물리적 세계의 일부 측정 결과를 혼합해야합니다.
철학적 메모 : 어떤 시점에서 당신은 어떤 똑똑한 사람들, 실험실 코트를 입거나 기초 연구를 위해 돈을받을 수있는 사람들을 믿어야합니다. SHA-256과 같은 해시 함수를 사용할 때 실제로 많은 암호 제작자가 다음과 같이 말할 때 신뢰하고 있습니다. 우리는 몇 년 동안 결점을 찾았고, 몇 년 동안 아무것도 찾지 못했습니다. 가이거 계수기와 함께 썩어가는 방사성 물질을 사용할 때, 당신은 다음과 같은 원자핵이 언제 터질지 예측할 방법을 찾기 위해 정말 열심히 봤지만 아무것도 발견하지 못했다고 말하는 몇몇 물리학 자들을 믿고있는 것입니다. 이 특정한 경우에 "물리학 자"에는 Becquerel, Rutherford, Bohr 또는 Einstein과 같은 사람들이 포함되며 "real hard"는 "한 세기가 넘는 축적 된 연구"를 의미하므로 여기에 정확히 들어오지 않은 영역에 있지는 않습니다. 그러나 여전히 보안에 대한 약간의 믿음이 있습니다.
일부 컴퓨터에는 이미 임의의 데이터를 생성하는 하드웨어가 포함되어 있습니다 (즉, 물리학자가 알 수있는 한 충분히 임의적 인 물리적 프로세스를 사용하고 측정). VIA C3 (x86 호환 CPU 라인)에는 이러한 하드웨어가 있습니다. 이상하게도 30 년 전 가정용 컴퓨터 인 Commodore 64에도 하드웨어 RNG가있었습니다 (또는 적어도 Wikipedia 에 따르면 ).
특별한 하드웨어를 제외하고는, 당신이 얻을 수있는 모든 물리적 이벤트를 사용해야합니다. 일반적으로 키 입력, 들어오는 이더넷 패킷, 마우스 이동, 하드 디스크 액세스 등을 사용합니다. 모든 이벤트는 일부 데이터와 함께 제공되며 측정 가능한 순간에 발생합니다 (최신 프로세서는주기 카운터 덕분에 매우 정확한 클럭을 가짐). 이러한 순간과 이벤트 데이터 내용은 엔트로피 소스로 누적 될 수 있습니다. 이것은 응용 프로그램보다 운영 체제 자체 (하드웨어에 직접 액세스 할 수 있음)가 훨씬 쉽기 때문에 시드를 수집하는 일반적인 방법은 운영 체제에 문의하는 것입니다 (리눅스에서는 이것을 호출 /dev/random
하거나 /dev/urandom
둘 다 장점과 문제점이 있습니다). , 독을 선택하십시오]; Windows에서는)로 전화 CryptGenRandom()
하십시오.
극단적 인 경우는 1.2 이전의 Java 애플릿이며 java.security.SecureRandom
; Java는 하드웨어에서 애플리케이션 코드를 분리하는 데 매우 효과적이기 때문에 임의의 시드를 얻는 것은 어려운 일이었습니다. 일반적인 해결책은 두 개 또는 세 개의 스레드를 동시에 실행하고 미치게 스레드 전환하는 것이 었습니다. 따라서 초당 스레드 전환 수는 다소 임의적이었습니다 (실제로 이는 OS 스케줄러 작업의 타이밍을 통해 임의성을 추출하려고합니다. 하드웨어 관련 이벤트를 포함하여 기계에서 발생하는 사항에 대해서도). 이것은 매우 불만족 스러웠습니다.
시간 관련 조치의 문제점은 공격자가 현재 시간도 알고 있다는 것입니다. 공격자가 머신에 적용 가능한 액세스 권한이 있으면 사이클 카운터도 읽을 수 있습니다.
어떤 사람들은 앰프를 최대로 설정하여 오디오 카드를 "백색 소음"의 원인으로 사용하도록 제안했습니다 (요즘에는 서버에도 오디오가 있음). 다른 사람들은 웹캠에 전원을 공급해야한다고 주장합니다 (웹캠 비디오가 "시끄러운"것이고 이는 웹캠이 벽을 향하고 있어도 임의성에 좋습니다). 그러나 웹캠이있는 서버는 일반적이지 않습니다. 또한 외부 네트워크 서버 (예 :)를 핑 (ping www.google.com
)하여 돌아 오는 데 걸리는 시간을 확인할 수 있습니다 (그러나 네트워크를 감시하는 공격자가이를 관찰 할 수 있음).
해시 함수를 사용하는 혼합 단계의 장점은 엔트로피가 누적 될 수 있다는 것입니다. 데이터가 무작위가 아니더라도 데이터를 추가해도 아무런 해가 없습니다. 해시 함수를 통해 가능한 한 많이 채우십시오. 해시 기능은 매우 빠르며 (좋은 SHA-512 구현은 단일 코어를 사용하여 일반적인 PC에서 150MB / s 이상을 처리합니다) 시드는 자주 발생하지 않습니다.
4. 결론
HSM을 사용하십시오 . 그들은 수백 또는 수천 달러의 비용이 들지만 당신의 비밀은 그보다 훨씬 더 가치가 있습니까? HSM은 RNG 하드웨어를 포함하고 PRNG 알고리즘을 실행하며 시드를 변조 방지와 함께 저장합니다. 또한 대부분의 HSM은 다양한 국가 규정 (예 : 미국의 FIPS 140, 유럽의 EAL 수준)과 관련하여 이미 인증을 받았습니다.
너무 저렴해서 HSM을 구매하지 않거나 실제로 그다지 가치가없는 데이터를 보호하려면 많은 물리적 측정 을 해싱하여 얻은 시드를 사용하여 암호화 보안 PRNG를 구축하십시오 . 일부 하드웨어에서 오는 모든 것은 해당 데이터를 얻은 순간 ( "사이클 카운터"읽기)과 함께 해시되어야합니다. 여기서 메가 바이트 단위로 데이터를 해시해야합니다. 또는 더 좋은 방법은 하지 마십시오. 운영 체제에서 제공하는 기능 (이미 해당 코드가 포함되어 있음)을 사용하십시오.
가장 안전한 시드는 가장 높은 수준의 엔트로피 (또는 예측할 수없는 가장 많은 비트 수)를 가진 시드입니다. 시간은 일반적으로 엔트로피가 작기 때문에 잘못된 시드입니다 (즉, 트랜잭션이 발생한시기를 알고 있다면 몇 비트 이내로 타임 스탬프를 추측 할 수 있습니다). 하드웨어 엔트로피 소스 (예 : 붕괴 프로세스)는 모든 시드에 대해 1 비트의 엔트로피를 생성하기 때문에 매우 좋습니다.
일반적으로 하드웨어 소스는 대부분의 요구에 비실용적이기 때문에 여러 저품질 엔트로피 소스를 혼합하여 더 높은 품질을 생성해야합니다. 일반적으로 각 샘플에 대한 엔트로피 비트 수를 추정 한 다음 충분한 샘플을 수집하여 엔트로피 소스에 대한 검색 공간이 공격자가 검색하는 것이 비실용적 일 수 있도록 충분히 커집니다 (128 비트는 좋은 경험 규칙입니다. ).
사용할 수있는 몇 가지 소스는 마이크로 초 단위의 현재 시간 (일반적으로 해상도 및 공격자가 추측하기 쉬운 정도에 따라 1/2 비트의 매우 낮은 엔트로피), UI 이벤트의 도착 간격 등입니다.
/ dev / random 및 Windows CAPI 난수 생성기와 같은 운영 체제 소스는 종종 이러한 낮은 엔트로피 소스의 사전 혼합 소스를 제공합니다. 예를 들어 Windows 생성기 CryptGenRandom 에는 다음이 포함됩니다.
- 현재 프로세스 ID (GetCurrentProcessID)입니다.
- 현재 스레드 ID (GetCurrentThreadID)입니다.
- 부팅 시간 이후의 틱 수 (GetTickCount).
- 현재 시간 (GetLocalTime)입니다.
- 다양한 고정밀 성능 카운터 (QueryPerformanceCounter) .-
- 사용자 이름, 컴퓨터 이름 및 검색 경로를 포함하는 사용자 환경 블록의 MD4 해시입니다. [...]-
- RDTSC, RDMSR, RDPMC와 같은 고정밀 내부 CPU 카운터
일부 PRNG에는 저품질 소스의 엔트로피를 혼합하여 고품질 결과를 생성 할 수있는 기본 전략이 있습니다. 아주 좋은 발전기 중 하나는 Fortuna 발전기입니다. 특히 엔트로피 소스가 손상 될 경우 위험을 제한하는 전략을 사용합니다.
가장 안전한 시드는 진정으로 임의의 시드로, 오늘날의 실제 컴퓨팅 시스템에서 사용하여 대략적으로 추정 할 수 있으며 신뢰도가 감소하는 것으로 나열됩니다.
- 특수 하드웨어
- 디스크 읽기 및 마우스 이동 (/ dev / random)과 같은 혼란스러운 이벤트를 캡처하기 위해 운영 체제에서 제공하는 기능. 이 "예측할 수없는 이벤트 캡처"라인의 또 다른 옵션은 OS에서 제공하는 '보안'난수 생성기 대신 엔트로피 풀로 발생하는 상황을 캡처하는 독립 프로세스 또는 시스템을 사용하는 것입니다. 예를 들어 EntropyPool을 참조하십시오 .
- 잘못된 시드 (예 : 시간)를 사용하여 사용자에게만 알려진 다른 데이터와 결합합니다 (예 : 시간을 암호 및 PID 또는 애플리케이션 / OS의 내부 상태와 같은 다른 기준으로 해싱하므로 그렇지 않습니다. 시간에 따라 반드시 증감)
일회성 패드에 대한 흥미로운 점으로, 스파이 활동에 참여할 때마다 몇 개의 편지 만 전달하면되는 시스템이 있습니다. 예를 들어, 내가 Grand Fenwick 공국에 토스터를 만들기위한 비밀 계획을 마지막으로 판매했을 때, 나는 속삭 이기만하면됩니다.
enonH
내 동맹에게. 그녀는 http://is.gd/enonH- (이것은 개구리의 완전한 SFW 이미지를 가리키는 is.gd 확장 페이지로 연결되는 "안전한"확장기 URL입니다). 이것은 우리에게 409k 비트의 일회성 패드를 제공했거나- "enonH"를 속삭이는 동안 윙크하는 경우-그녀는 이미지의 해시를 가져 와서 다음 전송을위한 디코딩 키로 사용하는 것을 알고 있습니다.
JPEG 이미지의 압축으로 인해 ent 가보고 한 것처럼 상대적으로 좋은 엔트로피 소스가되는 경향이 있습니다 .
$ ent frog.jpg
엔트로피 = 바이트 당 7.955028 비트.압축을 최적화하면이 51092 바이트 파일의 크기가 0 % 줄어 듭니다.
51092 개 샘플에 대한 카이 제곱 분포는 4409.15이며 무작위로이 값을 0.01 % 초과합니다.
데이터 바이트의 산술 평균 값은 129.0884 (127.5 = 랜덤)입니다.
Pi의 몬테카를로 값은 3.053435115 (오류 2.81 %)입니다.
직렬 상관 계수는 0.052738 (완전 비 상관 = 0.0), 비 상관 = 0.0)입니다.
내가 그녀에게 지시 한 거의 불가능한 이미지와 내 비밀 토스터 계획은 The Man으로부터 안전합니다.
대답은 /dev/random
Linux 시스템에 있습니다. 이것은 엔트로피 풀이 마르면 PRNG에 의해 생성 /dev/urandom
될 수있는 "실제"난수 생성기에 매우 가깝습니다 . 다음 인용문은 Linux 커널의 random.c에서 발췌 한 것입니다 .c 이 전체 파일은 멋진 읽기와 많은 주석입니다. 코드 자체는 PGP에서 채택되었습니다. 그 아름다움은 접근 자에 의해 래핑 된 전역 구조체로 표시되는 C의 제약에 의해 제한되지 않습니다. 단순히 경외감을 불러 일으키는 디자인입니다.
이 루틴은 장치 드라이버 등에서 환경 노이즈를 수집하고 암호화 사용에 적합한 좋은 난수를 반환합니다. 명백한 암호화 용도 외에도 이러한 번호는 TCP 시퀀스 번호를 시드하는 데 유용하며, 무작위 일뿐만 아니라 공격자가 예측하기 어려운 번호를 갖는 것이 바람직한 다른 장소에도 유용합니다.
작동 원리
컴퓨터는 매우 예측 가능한 장치입니다. 따라서 알고리즘 을 사용하여 쉽게 생성 할 수있는 의사 난수
와는 달리 컴퓨터에서 진정한 난수를 생성 하는 것은 매우 어렵 습니다 . 안타깝게도 공격자가 의사 난수 생성기의 시퀀스를 추측하는 것은 매우 쉬우 며 일부 애플리케이션에서는 허용되지 않습니다. 따라서 대신 외부 공격자가 관찰하기 어려운 컴퓨터 환경에서 "환경 소음"을 수집하고이를 사용하여 난수를 생성해야합니다. Unix 환경에서 이것은 커널 내부에서 가장 잘 수행됩니다.환경의 임의성 소스에는 키보드 간
타이밍, 일부 인터럽트의 인터럽트 간 타이밍 및 (a) 비 결정적이며 (b) 외부 관찰자가 측정하기 어려운 기타 이벤트가 포함됩니다. 이러한 소스의 임의성은 CRC와 유사한 기능을 사용하여 혼합되는 "엔트로피 풀"에 추가됩니다. 이것은 암호 학적으로 강력하지는 않지만 임의성이 악의적으로 선택되지 않는다고 가정하면 적절하며 모든 인터럽트에서 수행하는 오버 헤드가 매우 합리적 일만큼 빠릅니다. 랜덤 바이트가 엔트로피 풀에 혼합되면 루틴은 난수 생성기의 내부 상태에 저장된 임의 비트 수에 대한 추정치를 유지합니다.When random bytes are desired, they are obtained by taking the SHA
hash of the contents of the "entropy pool". The SHA hash avoids exposing the internal state of the entropy pool. It is believed to be computationally infeasible to derive any useful information about the input of SHA from its output. Even if it is possible to analyze SHA in some clever way, as long as the amount of data returned from the generator is less than the inherent entropy in
풀, 출력 데이터는 완전히 예측할 수 없습니다. 이러한 이유로 루틴은 난수를 출력 할 때 엔트로피 풀에 포함 된 "진정한 임의성"비트 수에 대한 내부 추정치를 줄입니다. 이 추정치가 0이 되더라도 루틴은 여전히 난수를 생성 할 수 있습니다. 그러나 공격자는 (적어도 이론 상으로는) 이전 출력에서 발전기의 미래 출력을 추론 할 수 있습니다. 이를 위해서는 SHA의 성공적인 암호화가 필요하며, 이는 실현 가능하지 않다고 생각되지만 먼 가능성이 있습니다. 그럼에도 불구하고이 숫자는 대부분의 목적에 유용해야합니다....
인터넷 라디오 클라이언트를 작성하고 방송에서 무작위 샘플을 사용합니다. 선택 및 / 또는 폴백 할 여러 스테이션 풀이 있습니다.
If you read into crypto-theory, it becomes apparent that the most secure seed would be one generated by a chaotic event. Throughout recent history, covert operations have made use of what is known as a "One-time pad" which is proven impossible to crack. Normally these are generated through an assortment of atmospheric listening posts scattered about the middle of nowhere. Atmospheric noise is sufficiently chaotic to be considered random. The main problem with this method is that the logistics for a one time pad are considerable.
My suggestion to you is to find a sufficiently chaotic event to somehow extract data from.
James is correct. In addition, there is hardware that you can purchase that will give you random data. Not sure where I saw it, but I think I read that some sound cards come with such hardware.
You can also use a site like http://www.random.org/
OK, assuming that the client needs a strong seed, and you are using cloud computing here is a solution, for some hardware random number generators you can look here:
http://en.wikipedia.org/wiki/Hardware_random_number_generator
So, this assumes that each client has a public/private key pair, where the server knows the public key for each client. To generate a key you can use something similar to what was done with PGP, in the beginning, where you take the difference in time between key strokes as someone types, as that won't be guessable.
So, the client submits a request for a random number. The server uses a hardware generator, encrypts it with the public key, and signs this with the server's private key. The client then can verify where it came from and then decrypt it.
This will ensure that you can generate a random number and pass it back in a secure fashion.
UPDATE:
Your best bet is to look in the Art of Computer Programming or any of the Numerical Methods book, or look at what Bruce Schneier has written, such as these links: http://www.schneier.com/blog/archives/2006/06/random_number_g.html http://www.cryptosys.net/rng_algorithms.html http://www.schneier.com/blog/archives/2006/06/random_number_g.html http://www.schneier.com/blog/archives/2006/06/random_number_g.html Suggestions for Random Number Generation in Software, ftp://ftp.rsasecurity.com/pub/pdfs/bull-1.pdf
You can also look at having Crypto++ do the generation, or at least look at how Wei Dai did it, http://www.cryptopp.com/
Random.org offers a true random number generator web service, "seeded" by the atmospheric noise.
You get 200,000 random bits for free each day, up to the 1 million random bits cap after that you should top up your account, it gets as cheap as 4 million bits per dollar.
4 - chosen by very random dice roll. :-)
Simple solution if no additional random hardware are available.
Use milliseconds, mouseX and mouseY to generate a seed.
As the consensus is cryptographically strong random numbers must derived form hardware. Some processors have this functionality (Intel chips amonst others). Also sound cards can be used for this by measuring the low-bit fluctuations in the a-d converter.
But due to the hardware needs the is no language and platform independent answer. Pretty much any larger OS will have support for secure random numbers. It is also tricky to implement a good random number generator with good output, since you will have to track the remaining entropy in the pool.
So the first step is to determine what language(s) you will be using. Some do have strong random number support - if this is not the case you would have to abstract the generation to call platform-dependent random sources.
Depending on your security needs be weary of "online" sources since a man-in-the midde can be a serious threat for unauthenticated online sources.
Your most secure methods will come from nature. That is to say, something that happens outside of your computer system and beyond our ability to predict it's patterns.
For instance, many researchers into Cryptographically secure PRNGs will use radioactive decay as a model, others might look into fractals, and so forth. There are existing means of creating true RNGs
One of my favorite ways of implementing a PRNG is from user interaction with a computer. For instance, this post was not something that could be pre-determined by forward-engineering from my past series of posts. Where I left my mouse on my screen is very random, the trail it made is also random. Seeing from user-interactions is. Abuse from the means of providing specific input such that specific numbers are generated could be mitigated by using a 'swarm' of user inputs and calculating it's 'vector', as long as you do not have every user in your system as an Eve, you should be fine. This is not suitable for many applications, as your pool of numbers is directly proportional to user input. Implementing this may have it's own issues.
People interested in RNG have already done things such as:
- Use a web cam, whatever the random blips in the screen hash out to, when that truck passes by, that's all random data.
- As mentioned already, radiation
- Atmosphere
- User interaction (as mentioned)
- What's going on within the system EDG.
Secure seeds come from nature.
edit: Based on what you're looking at doing, I might suggest using an aggregation of your cloud server's EDG.
First you need to define the actual use/purpose of the random number generator and why do you think in has to pass so high security standard? The reason I ask is that you mentioned picking it from the could - if you are using it indeed for security purposes then securing the source and the channel to send it around is much more important than anyone's academic knit-picking.
Second element is the size of the actual random numbers you need - big seed is good but only if the number generated is also big - otherwise you'll just be reading the small part of the generated number and that will increase your risk.
Look into reconfigurable ciphers, rather than things like SHA or AES. Here are 2 research papers if you want to read and verify how and why they work:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.97.6594&rep=rep1&type=pdf http://www.springerlink.com/index/q29t6v1p45515186.pdf
Or grab any reconfigurable GOST cipher source code you find on the net and then you an either feed it just any basic seed (like concatenated "ticker" plus a web server node ID (if it's in a web farm) plus a part of response on any internet news site that changes top news all the time or you can feed it highly controlled initial seed (which you can make on your own) and use a light pseudo-random sequence for selecting further cipher configurations. Even NSA can't break that one :-) Since it's always a different cipher. For actual crypto purposes one virtually has to use very controlled initial seed just to be able to replicate the sequence for validation. That's where we go back to first item - securing the source and distribution.
Use random.org they claim to offer true random numbers to anyone on the Internet and they also have an HTTP API which you can use. They offer both free and paid services.
disclaimer: i am not in any way affiliated with random.org
With Linux, the answer is /dev/random (in Windows I think the equivallent is called CryptGenRand).
However, in a cloud environment /dev/random can be severely depleted and might not have enough entropy to answer you request.
To solve that problem, our company is developping a true random number generator appliance that can provide good random numbers (of quantum origin) to thousands of servers and VM simultaneously. If the appliance is installed in the LAN of your cloud datacenter, all you would need is our deamon running in your machine. This deamon monitors /dev/random entropy level and when entropy is needed makes a request to the appliance (over the network) and puts the received random data in the kernel's entropy pool.
If you want to know more about our solution, please visit our website (www.sqrtech.com) or contact us at info@sqrtech.com.
Julien
You can earn random numbers generated by radioactive decay. Sounds a little strange at first, but you get real random numbers out of this.
THIS IS A GUESS! Crypto geeks please correct if I've got it wrong
The official algorithm for UUID/GUID at this point returns a result that is run through a cryptographic hash function - it takes known information, such as time, mac addr, and a counter to form a UUID/GUID and then runs this through a cryptographic hash to ensure that the mac address cannot be extracted.
I believe you can XOR this down to the number of bits you require for a seed with a reasonably good guarantee that the resultant value is equally distributed over the number space defined by your desired bit count. Note I am not claiming this is secure, only that this action should produce a value that distributes evenly across the bit space over time.
(((PI X current thread ID) X current process ID) / tick count) x pi
'program tip' 카테고리의 다른 글
임의의 날짜로 행을 업데이트하는 방법 (0) | 2020.11.26 |
---|---|
jQuery, 다중으로 배열을 얻는 방법 (0) | 2020.11.26 |
Ruby를 사용하여 명령을 5 번 실행하려면 어떻게해야합니까? (0) | 2020.11.26 |
app.xaml에서 기본 WPF 창 스타일을 설정하는 방법은 무엇입니까? (0) | 2020.11.25 |
Java는 다중 코어를 어떻게 사용합니까? (0) | 2020.11.25 |