>  기사  >  백엔드 개발  >  PHP의 CSPRNG 함수

PHP의 CSPRNG 함수

墨辰丷
墨辰丷원래의
2018-06-05 13:54:531789검색

이 글은 주로 PHP의 CSPRNG 기능을 소개합니다. 관심 있는 친구들이 참고하면 좋겠습니다.

1. CSPRNG란

위키피디아를 인용하면 암호학적으로 안전한 의사 난수 생성기(CSPRNG)는 의사 난수를 생성하는 의사 난수 생성기(PRNG)입니다. 난수는 암호화 알고리즘에 적합합니다.

CSPRNG는 주로 다음 용도로 사용될 수 있습니다.

  • 키 생성(예: 복잡한 키 생성)

  • 새로운 사용자를 위한 무작위 비밀번호 생성

  • 암호화 시스템

열쇠 높은 수준의 보안을 얻기 위한 측면은 고품질 무작위성입니다.

2. PHP7의 CSPRNG

PHP 7에는 CSPRNG를 구현하는 데 사용할 수 있는 두 가지 새로운 함수인 random_bytes 및 random_int가 도입되었습니다.

random_bytes 함수는 문자열을 반환하고 반환된 결과의 바이트 수를 나타내는 int 입력 매개 변수를 받아들입니다.

예:


$bytes = random_bytes('10');
var_dump(bin2hex($bytes));
//possible ouput: string(20) "7dfab0af960d359388e6"


random_int 함수는 지정된 범위 내의 int 숫자를 반환합니다.

예:


var_dump(random_int(1, 100));
//possible output: 27


3. 백그라운드 실행 환경

위 함수의 무작위성은 환경에 따라 다릅니다.

  • 창에서는 항상 CryptGenRandom()이 사용됩니다.

  • 다른 플랫폼에서는 가능한 경우 arc4random_buf()가 사용됩니다(BSD 시리즈 또는 libbsd가 있는 시스템에서 설정됨).

  • 위 중 어느 것도 사실이 아닌 경우 Linux 시스템은 getrandom( 2)를 사용하게 됩니다.

  • 그래도 작동하지 않으면 /dev/urandom이 사용 가능한 마지막 도구로 사용됩니다.

  • 위의 어느 것도 작동하지 않으면 시스템에서 오류가 발생합니다

4, 1 간단한 테스트

좋은 난수 생성 시스템은 적절한 생성 "품질"을 보장합니다. 이 품질을 확인하기 위해 일반적으로 일련의 통계 테스트가 수행됩니다. 복잡한 통계 주제를 깊이 파고들지 않고도 알려진 동작을 숫자 생성기의 결과와 비교하면 품질 평가에 도움이 될 수 있습니다.

간단한 테스트는 주사위 게임입니다. 주사위 1개를 한 번 굴려 6이 나올 확률이 1/6이라고 가정하고, 주사위 3개를 동시에 100번 굴리면 결과는 대략 다음과 같습니다.

0 6 = 57.9회
1 6 = 34.7배
2 6s = 6.9배
3 6s = 0.5배
다음은 주사위 굴리기 1,000,000회를 구현하는 코드입니다.


$times = 1000000;
$result = [];
for ($i=0; $i<$times; $i++){
  $dieRoll = array(6 => 0); //initializes just the six counting to zero
  $dieRoll[roll()] += 1; //first die
  $dieRoll[roll()] += 1; //second die
  $dieRoll[roll()] += 1; //third die
  $result[$dieRoll[6]] += 1; //counts the sixes
}
function roll(){
  return random_int(1,6);
}
var_dump($result);


PHP7의 Random_int와 간단한 rand 함수를 사용하면 다음과 같은 결과를 얻을 수 있습니다. 다음 결과

더 나은 비교를 위해 먼저 rand와 random_int를 보면 공식을 적용하고 결과를 그래프에 그릴 수 있습니다. 공식은 (php 결과-예상 결과)/예상 결과의 0.5승입니다.

결과 그래프는 다음과 같습니다.

(0에 가까운 값이 더 좋음)

3 6s의 결과가 잘 수행되지 않고 이 테스트가 실제 적용하기에는 너무 간단하지만 우리는 여전히 다음을 볼 수 있습니다. random_int는 잘 작동합니다.

또한 난수 생성기의 예측 불가능성과 반복 가능한 동작으로 인해 애플리케이션의 보안 수준이 향상됩니다.

요약: 위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

관련 추천 :

PHP 실행주기 예제 분석의 원리

PHP 소스코드 디렉토리 구조와 기능 설명에 대한 자세한 설명

PHP 모듈러 설치 세부 단계 튜토리얼


위 내용은 PHP의 CSPRNG 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.