API에 액세스하기위한 32 자 토큰을 생성하기 위해 현재 다음을 사용합니다.
$token = md5(uniqid(mt_rand(), true));
이 방법은 시스템 시계를 기반으로하기 때문에 암호 학적으로 안전하지 않으며 openssl_random_pseudo_bytes
예측하기가 더 어렵 기 때문에 더 나은 솔루션이 될 것이라고 읽었습니다 .
이 경우 동등한 코드는 어떻게 생겼습니까?
나는 이런 것을 추측하지만 이것이 옳은지 모르겠습니다 …
$token = md5(openssl_random_pseudo_bytes(32));
또한 함수에 전달해야하는 길이는 어느 정도입니까?
답변
올바른 해결책은 다음과 같습니다.
$token = bin2hex(openssl_random_pseudo_bytes(16));
# or in php7
$token = bin2hex(random_bytes(16));
답변
openssl_random_pseudo_bytes를 사용하려면 CrytoLib의 구현을 사용하는 것이 가장 좋습니다. 이렇게하면 모든 영숫자 문자를 생성 할 수 있습니다.
path / to /를 cryptolib.php 파일을 넣은 위치로 바꿉니다 (GitHub에서 찾을 수 있음 : https://github.com/IcyApril/CryptoLib ).
<?php
require_once('path/to/cryptolib.php');
$token = IcyApril\CryptoLib::randomString(16);
?>
전체 CryptoLib 문서는 https://cryptolib.ju.je/ 에서 볼 수 있습니다 . 다른 많은 임의 방법, 계단식 암호화, 해시 생성 및 유효성 검사를 다룹니다. 하지만 필요한 경우 거기에 있습니다.
답변
암호화 된 보안 난수 생성기가있는 경우 출력을 해시 할 필요가 없습니다. 사실 당신은 원하지 않습니다. 그냥 사용
$token = openssl_random_pseudo_bytes($BYTES,true)
그러나 $ BYTES는 원하는 데이터의 수입니다. MD5에는 128 비트 해시가 있으므로 16 바이트가 가능합니다.
참고로, 원래 코드에서 호출하는 함수는 암호 학적으로 안전하지 않으며, 대부분은 하나만 사용하면 안전한 다른 함수와 결합하더라도 안전하지 않을 정도로 충분히 해 롭습니다. MD5에는 보안 문제가 있습니다 (이 응용 프로그램에서는 관련이 없을 수 있음). Uniqid는 기본적으로 암호 학적으로 임의의 바이트를 생성하지 않을뿐만 아니라 (시스템 클럭을 사용하기 때문에), 추가 된 엔트로피는 암호 학적으로 안전하지 않은 선형 합동 생성기를 사용하여 결합됩니다. 실제로 서버 시계의 가치를 알지 못하더라도 일부에 대한 액세스 권한이 부여 된 모든 API 키를 추측 할 수 있음을 의미합니다. 마지막으로, 추가 엔트로피로 사용하는 mt_rand ()도 안전한 난수 생성기가 아닙니다.
답변
신뢰할 수있는 암호 ASCII 문자 a-zA-Z 및 숫자 0-9 로만 만들 수 있습니다 . 가장 좋은 방법은 PHP7의 random_int () 또는 random_bytes () 와 같은 암호화 보안 메서드 만 사용 하는 것입니다. rest functions as base64_encode () 문자열의 신뢰성을 높이고 ASCII 문자로 변경하기위한 지원 함수로만 사용할 수 있습니다 .
mt_rand () 는 안전하지 않으며 매우 오래되었습니다. 임의의 문자열에서 random_int ()를 사용해야합니다. 바이너리 문자열에서 바이너리 문자열을 신뢰할 수있게 만들려면 base64_encode () 를 사용해야합니다 .
이 함수의 구현을 참조하십시오. 모든 언어를 사용합니다.
답변
