암호화로 보호된 토큰 생성
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의 구현을 사용하는 것이 가장 좋습니다.이것에 의해, 모든 영숫자를 생성할 수 있습니다.openssl_random_pseudo_bytes 주위에 bin2hex를 붙이면, A-F(캡)와 숫자가 표시됩니다.
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바이트면 충분합니다.
참고로 원래 코드에서 호출한 함수는 암호화적으로 안전하지 않습니다.대부분은 안전한 다른 함수와 조합해도 1개만 사용해도 안전하지 않을 정도로 해롭습니다.MD5에는 보안상의 문제가 있습니다(단, 이 어플리케이션에서는 관련이 없을 수 있습니다).Uniqid는 디폴트로는 암호화로 랜덤 바이트를 생성하지 않을 뿐만 아니라(시스템 클럭을 사용하기 때문에), 추가된 엔트로피는 선형 합동 생성기를 사용하여 결합되며, 이는 암호화로 안전하지 않습니다.사실 이는 서버 클럭의 값을 모르는 경우에도 일부 API 키에 접근할 수 있는 모든 API 키를 추측할 수 있음을 의미합니다.마지막으로 추가 엔트로피로 사용하는 mt_rand()도 안전한 난수 발생기가 아닙니다.
또 다른 옵션은 ircmaxell(https://github.com/ircmaxell/RandomLib)에서 RandomLib을 사용하는 것입니다.
★★★★★★composer require ircmaxell/random-lib
중간 강도 예시
$factory = new Factory();
$factory->getMediumStrengthGenerator()->generateString(32);
신뢰할 수 있는 패스워드:아스키 문자 a-zA-Z와 숫자 0-9로만 만들 수 있습니다.이를 위해서는 PHP7의 random_int() 또는 random_bytes()와 같은 암호학적으로 안전한 메서드만 사용합니다.rest functions as base64_encode() 문자열의 신뢰성을 높이고 ASCII 문자로 변경하기 위한 지원 기능으로만 사용할 수 있습니다.
mt_rand()는 안전하지 않고 매우 오래되었습니다.임의의 문자열에서 random_int()를 사용해야 합니다.바이너리 문자열에서 base64_encode()를 사용하여 바이너리 문자열을 신뢰할 수 있는 문자열 또는 bin2hex로 만들어야 하지만 바이트를 16개 위치(값)로만 잘라야 합니다.이 기능의 실장을 참조해 주세요.모든 언어를 사용합니다.
언급URL : https://stackoverflow.com/questions/18830839/generating-cryptographically-secure-tokens
'programing' 카테고리의 다른 글
IPython 서브모듈 새로고침 (0) | 2023.01.24 |
---|---|
MySQLworkbench 연결 인코딩을 UTF8로 설정하는 방법 (0) | 2023.01.24 |
판다의 발생을 세는 가장 효율적인 방법은 무엇일까요? (0) | 2023.01.24 |
Wordpress에서의 커스텀쿼리 실행에 문제가 있는 경우 (0) | 2023.01.24 |
클래스의 최종 정적 필드 값은 어떻게 참조할 수 있습니까? (0) | 2023.01.24 |