PHP 의 위조 난수 와 진짜 난수 상세 설명
위조 랜 덤 수 는 가짜 랜 덤 수가 아니다.이곳 의'위조'는 규칙 적 인 뜻 이다.즉,컴퓨터 가 발생 하 는 위조 랜 덤 수 는 랜 덤 이자 규칙 적 인 것 이다.어떻게 이해 해요?발생 하 는 위조 무 작위 수 는 때로는 일정한 규칙 을 지 키 고 때로는 어떠한 규칙 도 지 키 지 않 는 다.위조 무 작위 수 는 일부분 이 일정한 규칙 을 준수 한다.다른 부분 은 어떤 규칙 도 지 키 지 않 는 다.예 를 들 어'세상 에 두 개의 모양 이 똑 같은 나뭇잎 이 없다'는 것 은 바로 사물 의 특성,즉 임 의 성 을 점 한 것 이다.그러나 모든 나무의 잎 은 비슷 한 모양 을 가지 는데 이것 이 바로 사물 의 공통성,즉 규칙 성 이다.이런 측면 에서 볼 때,너 는 아마도 이러한 사실 을 받 아들 일 것 이다.컴퓨터 는 위조 난수 만 생 길 수 있 을 뿐 절대 난수 가 생 길 수 없다.
우선 진 난수 와 위 난수 의 개념 을 알 아 보 자.
진짜 난수 발생 기:영어:true random number generator,약칭:TRNGs,예측 할 수 없 는 물리 적 방식 으로 발생 하 는 난수 입 니 다.
의사 난수 발생 기:영어:pseudo-random number generator,약칭:PRNGs,컴퓨터 가 일정한 알고리즘 을 이용 하여 만 든 것 입 니 다.
두 가지 방법 으로 만들어 진 난수 의 그림 을 비교 해 보 세 요.
Random.org(대기 소음 을 이용 하여 무 작위 수 를 생 성 하 는데 대기 소음 은 공기 중의 천둥 과 폭풍 으로 인해 발생 하 는 것 이다)생 성 된 무 작위 비트 맵:
Windows 에서 PHP 의 rand()함수 가 만 든 무 작위 그림:
후자 의 위조 난수 발생 기 가 만 든 그림 에는 이런 뚜렷 한 줄무늬 가 있 음 이 분명 하 다.
php 의 랜 덤 함 수 를 이용 하여 이 그림 을 만 드 는 코드 는 다음 과 같 습 니 다.
// gd
header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512)
or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
for ($y=0; $y<512; $y++) {
for ($x=0; $x<512; $x++) {
if (rand(0,1) === 1) {
imagesetpixel($im, $x, $y, $white);
}
}
}
imagepng($im);
imagedestroy($im);
실제로 모든 위조 난수 발생 기(PRNGs)의 효과 가 이렇게 나 쁜 것 은 아니다.다만 마침 윈도 에 있 는 PHP 의 rand()함수 가 이렇다.리 눅 스에 서 같은 코드 를 테스트 한다 면 그림 에 도 뚜렷 한 줄무늬 가 보이 지 않 는 다.Windows 에서 mt 를 사용 하면rand()함수 가 rand()함 수 를 대체 하면 효과 도 많이 좋아 집 니 다.mtrand()는 Mersenne Twister(마케도니아 회전)알고리즘 을 사용 하여 무 작위 수 를 만 들 었 습 니 다.PHP 문서:mtrand()는 libc 가 제공 하 는 rand()보다 무 작위 수치의 평균 속도 가 4 배 빠르다.또한 리 눅 스 커 널(1.3.30 이상)은 난수 발생 기/dev/random 을 포함 하여 많은 안전 목적 에 충분 하 다.
다음은 리 눅 스 의 난수 발생 기 원리 에 대한 소개 입 니 다.
Linux 운영 체 제 는 본질 적 으로 랜 덤(또는 최소한 강력 한 랜 덤 위 젯)의 라 이브 러 리 데 이 터 를 제공 합 니 다.이 데 이 터 는 보통 장치 드라이버 에서 나온다.예 를 들 어 키보드 드라이버 는 두 버튼 사이 의 시간 정 보 를 수집 한 다음 에 이 환경 소음 을 난수 발생 기 라 이브 러 리 에 기입 한다.
무 작위 데 이 터 는 엔트로피 탱크(Liux 커 널 은 엔트로피 탱크 를 유지 하여 장치 드라이버 와 다른 소스 에서 온 환경 소음 을 수집 합 니 다.이론 적 으로 엔트로피 탱크 의 데 이 터 는 완전히 랜 덤 으로 진짜 랜 덤 수 서열 을 실현 할 수 있다.엔트로피 탱크 에 있 는 데이터 의 임 의 성 을 추적 하기 위해 커 널 은 데 이 터 를 탱크 에 넣 을 때 데이터 의 임 의 성 을 평가 하고 이 과정 을 엔트로피 추산 이 라 고 합 니 다.엔트로피 추산 치 설명 탱크 에 포 함 된 무 작위 숫자 입 니 다.그 값 이 클 수록 탱크 에 있 는 데이터 의 무 작위 성 이 좋 습 니 다.)새로운 데이터 가 들 어 올 때마다'교반'을 한다.이런 교반 은 사실상 수학 전환 으로 임 의 성 을 높이 는 데 도움 이 된다.데이터 가 엔트로피 탱크 에 추 가 된 후에 시스템 은 얼마나 많은 진정한 무 작위 위 치 를 얻 었 는 지 추정 합 니 다.
무 작위 적 인 총량 을 측정 하 는 것 은 매우 중요 하 다.문 제 는 어떤 양 이 먼저 생각 할 때 보다 임 의 성 이 적다 는 점 이다.예 를 들 어 지난번 키 보드 를 눌 렀 을 때 부터 초 수 를 나타 내 는 32 자리 수 를 추가 하 는 것 은 사실상 새로운 32 자리 무 작위 정 보 를 제공 하지 않 았 다.대부분의 버튼 이 비슷 하기 때문이다.
/dev/random 에서 바이트 를 읽 은 후 엔트로피 풀 은 MD5 알고리즘 을 사용 하여 암호 로 해시 되 며,이 해시 의 각 바이트 가 숫자 로 변환 되 어 되 돌아 갑 니 다.
엔트로피 풀 에 사용 할 수 있 는 임 의 위치 가 없 으 면/dev/random 은 풀 에 충분 한 임 의 성 이 있 기 전에 기다 리 고 결 과 를 되 돌려 주지 않 습 니 다.이것 은/dev/random 을 사용 하여 많은 무 작위 수 를 만 들 면 너무 느 리 고 실 용적 이지 않다 는 것 을 의미한다.우 리 는 자주/dev/random 에서 몇 십 바이트 의 데 이 터 를 생 성 한 후에 많은 초 동안 결과 가 나 오지 않 는 다.
다행히도 엔트로피 탱크 가 있 는 다른 인 터 페 이 스 는 이 제한 을 돌아 갈 수 있 습 니 다:/dev/urandom.엔트로피 탱크 에 무 작위 로 사용 할 수 없 더 라 도 이 대체 장 치 는 항상 무 작위 수 를 되 돌려 줍 니 다.엔트로피 풀 에 충분 한 시간 을 주지 않 고 많은 수 를 꺼 내 면 더 이상 각종 소스 의 합 용 엔트로피 의 장점 을 얻 을 수 없습니다.그러나 엔트로피 탱크 의 MD5 해시 에서 아주 좋 은 무 작위 수 를 얻 을 수 있 습 니 다!이러한 방식 의 문 제 는 MD5 알고리즘 을 풀 고 출력 을 통 해 해시 입력 에 관 한 정 보 를 알 게 되면 사용자 의 수 는 즉시 완전히 예측 할 수 있 습 니 다.대부분의 전문가 들 은 이런 분석 이 계산 적 으로 불가능 하 다 고 생각한다.그러나 여전히/dev/urandom 이/dev/random 보다 안전 하지 않다 고 생각 합 니 다.
Windows 에 서 는/dev/random 을 사용 할 수 없 지만 마이크로소프트 의"capicom.dll"이 제공 하 는 CAPICOM.Utilities 대상 을 사용 할 수 있 습 니 다.
다음은 PHP 사용 시 mtrand()함수 가 더 좋 은 위조 랜 덤 수 를 만 드 는 예 코드:
<?php
// get 128 pseudorandom bits in a string of 16 bytes
$pr_bits = '';
// Unix/Linux platform?
$fp = @fopen('/dev/urandom','rb');
if ($fp !== FALSE) {
$pr_bits .= @fread($fp,16);
@fclose($fp);
}
// MS-Windows platform?
if (@class_exists('COM')) {
try {
$CAPI_Util = new COM('CAPICOM.Utilities.1');
$pr_bits .= $CAPI_Util->GetRandom(16,0);
// if we ask for binary data PHP munges it, so we
// request base64 return value. We squeeze out the
// redundancy and useless ==CRLF by hashing...
if ($pr_bits) { $pr_bits = md5($pr_bits,TRUE); }
} catch (Exception $ex) {
// echo 'Exception: ' . $ex->getMessage();
}
}
if (strlen($pr_bits) < 16) {
// do something to warn system owner that
// pseudorandom generator is missing
}
?>
그래서 PHP 에서 진짜 무 작위 수 를 만 들 려 면 외부 요 소 를 사용 해 야 합 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.