Paragon Initiative Enterprises에서 만들고 유지 관리하는 random_bytes()
및 random_int()
용 PHP 5.x 폴리필입니다.
이 라이브러리는 이전 버전의 PHP에서 작동 해야 하지만 지원되는 PHP 버전과 관련된 문제만 고려할 것입니다. 지원되지 않는 PHP 버전을 사용하고 계시다면, 가능한 한 빨리 업그레이드하시기 바랍니다.
이 라이브러리는 PHP 커뮤니티의 일부 보안 전문가에 의해 검사되었지만 항상 우리가 간과한 부분이 있을 수 있습니다. 프로덕션 환경에 배포하는 것을 고려하기 전에 신뢰할 수 있는 해커에게 구현 오류 및 버그를 확인하도록 요청하세요.
마스터 브랜치를 사용하지 말고 안정적인 릴리스를 사용하세요.
이 라이브러리의 배경에 대해서는 PHP에서 임의의 정수 및 문자열 생성에 대한 블로그 게시물을 참조하세요.
PHP가 무작위 데이터를 안전하게 생성할 수 없는 경우 이 라이브러리는 Exception
발생시킵니다. 결코 안전하지 않은 무작위 데이터로 되돌아가지 않습니다. 이런 일이 계속 발생하면 즉시 최신 버전의 PHP로 업그레이드하세요.
작곡가의 경우:
# For libraries and frameworks that support PHP 5 but may be used by # other software that only supports PHP 7: composer require paragonie/random_compat:>=2 # For software that explicitly needs PHP 5 support: composer require paragonie/random_compat:<9.99
서명된 PHP 아카이브:
버전 1.2.0부터는 Github의 각 안정 릴리스마다 ECDSA 서명 PHP 아카이브도 제공됩니다.
.phar
, .phar.pubkey
및 .phar.pubkey.asc
파일을 다운로드합니다.
( 권장 되지만 필수는 아님) Paragon Initiative Enterprises용 PGP 공개 키를 사용하여 .phar.pubkey
( .asc
파일에 포함됨)의 PGP 서명을 확인합니다.
.phar
및 .phar.pubkey
파일을 모두 동일한 디렉터리에 추출합니다.
require_once "/path/to/random_compat.phar";
새 버전이 출시되면 .phar
파일만 교체하면 됩니다. .pubkey
는 변경되지 않습니다(서명 키가 손상되지 않는 한).
수동 설치:
안정적인 릴리스를 다운로드하세요.
프로젝트에 파일을 추출합니다.
require_once "/path/to/random_compat/lib/random.php";
진입점은 /lib
의 다른 파일이 아닌 lib/random.php
직접이어야 합니다.
이 라이브러리는 PHP 5 프로젝트에서 사용하기 위해 PHP 7에 추가된 CSPRNG 함수를 노출합니다. 그들의 행동은 동일해야 합니다.
{$string = random_bytes(32);를 시도해 보세요. } catch (TypeError $e) {// 음, 정수이므로 IS 예기치 않은 오류가 발생했습니다.die("예기치 않은 오류가 발생했습니다."); } catch (Error $e) {// 32가 합당한 정수이므로 이 역시 예상치 못한 일입니다.die("예기치 않은 오류가 발생했습니다"); } catch (Exception $e) {// 이 메시지가 표시되면 CSPRNG가 실패한 것입니다. hard.die("임의의 문자열을 생성할 수 없습니다. 우리 OS는 안전합니까?"); }var_dump(bin2hex($string));// 문자열(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
{$int = random_int(0, 255);를 시도해 보세요. } catch (TypeError $e) {// 음, 정수이므로 IS 예기치 않은 오류가 발생했습니다.die("예기치 않은 오류가 발생했습니다."); } catch (Error $e) {// 0과 255가 모두 합당한 정수이기 때문에 이것도 예상치 못한 일입니다.die("예기치 않은 오류가 발생했습니다"); } catch (Exception $e) {// 이 메시지를 받으면 CSPRNG가 실패한 것입니다. hard.die("임의의 정수를 생성할 수 없습니다. 우리 OS는 안전합니까?"); }var_dump($int);// int(47)
예외 및 오류를 처리할 때 PHP 5와 PHP7 간의 차이점을 고려해야 합니다.
차이점:
Error
잡기는 Exception
이전에 catch되는 한 작동합니다.
Catching Exception
이전에 Error
포착하지 않고 다른 동작을 수행합니다.
모든 오류/예외를 포착할 수 있는 이식 가능한 방법은 없습니다 .
항상 Exception
전에 Error
잡아야 합니다.
{return random_int(1, $userInput);을 시도해 보세요. } catch (TypeError $e) {// `Exception` 이전에 `Error`가 발견되는 한 괜찮습니다.throw new Exception('숫자를 입력하세요!'); } catch (Error $e) {// 아무것도 할 필요가 없으면 rethrow.throw $e; } catch (예외 $e) {// 이것은 선택 사항이며 생성 중에 오류를 처리하고 싶지 않으면 생략될 수도 있습니다//.throw new InternalServerErrorException('죄송합니다. 서버가 중단되어 임의의 데이터를 생성할 수 없습니다.',500 ,$e); }
예외가 발생하면 운영 체제가 안전하지 않은 것입니다.
Windows를 사용하는 경우 mcrypt를 활성화했는지 확인하세요.
다른 OS를 사용하는 경우 /dev/urandom
읽을 수 있는지 확인하세요.
FreeBSD Jail은 호스트 OS에서 /dev/urandom
노출해야 합니다.
open_basedir
사용하는 경우 /dev/urandom
이 허용되는지 확인하세요.
이 라이브러리는 안전하지 않은 난수 생성기로 대체되지 않으며 어떤 패치도 허용하지 않습니다.
Composer.json에 이와 같은 줄이 있는 프로젝트를 사용하는 경우
"require" { ... "paragonie/random_compat": "~1.1", ... }
...그리고 나서 random_compat 2(또는 이 보안 PHP 암호화 라이브러리와 같이 random_compat 2를 명시적으로 요구하는 다른 라이브러리)를 추가하려고 하면 버전 충돌이 발생합니다.
해결책은 사용자를 버전 1로 강제 잠금하는 대신 버전 2 이상을 사용할 수 있도록 프로젝트에서 요구 사항 문자열을 업데이트하도록 하는 것입니다.
"필요하다" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",... }
참고 : 이 라이브러리를 아무 작업도 수행하지 않게 만드는 9.99.99
라는 특수 버전이 있지만 PHP 7에만 설치할 수 있습니다.
PHP 5를 지원하는 소프트웨어(예: 라이브러리)를 작성하고 있지만 그렇지 않은 소프트웨어에서 사용될 수 있는 경우 9.99.99
설치를 허용하는 것이 좋습니다. 위의 차이점은 당신이 원하는 것입니다.
반대로, (그 자체로) PHP 5를 지원하는 소프트웨어를 작성하는 경우 9.99.99가 설치되는 것을 원하지 않으므로 대신 다음과 같이 변경하는 것이 좋습니다.
"필요하다" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",... }
"빈" 버전 9.99.99
설치하지 않으려면 루트 composer.json
에 replace
섹션을 추가할 수 있습니다.
"replace": { "paragonie/random_compat": "9.99.99" },
Composer가 아닌 PHP 아카이브(Phar) 접근 방식을 사용하고 있고 "매니페스트 읽기 길이는 {int1}
이었으며 {int2}
이어야 합니다"라는 오류 메시지가 표시되는 경우 Phar 확장이 활성화되지 않았을 수 있습니다.
이 문제를 해결하는 방법에 대한 구체적인 지침은 이 의견을 참조하세요.
이 프로젝트는 다음 개인들의 기여가 없었다면 오늘날처럼 훌륭하지 못했을 것입니다.
@AndrewCarterUK (앤드류 카터)
@asgrim(제임스 티컴)
@bcremer (벤자민 크레머)
@chriscct7 (크리스 크리스토프)
@CodesInChaos(기독교 위너라인)
@ConnorVG (코너 S. 파크스)
@cs278 (크리스 스미스)
@cweagans (카메론 이건스)
@dd32 (디온 헐스)
@geggleto (글렌 이글턴)
@glensc (엘란 루사마에)
@GrahamCampbell (그레이엄 캠벨)
@ircmaxell(안소니 페라라)
@jdevalk (주스트 드 발크)
@jedisct1(프랭크 데니스)
@juliangut (줄리안 구티에레즈)
@kelunik (니클라스 켈러)
@lt(리)
@MasonM (메이슨 말론)
@menkaff (메헤란 NikNafs)
@mmeyer2k (마이클 M)
@narfbg (안드레이 안드레예프)
@nicolas-grekas (니콜라스 그레카스)
@ocean90(도미닉 쉴링)
@oittaa
@oucil(케빈 팔리)
@philios33 (필 니콜스)
@redragonx (스티븐 차베스)
@relaxnow (소년 바우케마)
@rchouinard (라이언 쉬나드)
@rugk
@SammyK(새미 케이 파워스)
@scottchiefbaker (스콧 베이커)
@skyosev (스토얀 쿄세프)
@sthen(스튜어트 헨더슨)
@stof (크리스토프 코에보에)
@teohhanhui (테오한희)
@tom-- (톰 워스터)
@tsyr2ko
@trowski(아론 피오트로스키)
@twistor (크리스 레판넨)
@vinkla (빈센트 클라이버)
@voku (라스 모엘레켄)
@xabbuh (크리스티안 플로트만)
귀하의 회사가 제품이나 서비스에 이 라이브러리를 사용하는 경우 Paragon Initiative Enterprises로부터 지원 계약을 구매하는 데 관심이 있을 수 있습니다.