PHP에서 crypt () 함수는 일반적으로 비밀번호를 해시하는 데 사용되며 원래 의도는 데이터 암호화 또는 서명이 아닌 비밀번호를 확인하는 것입니다. 그러나 일부 실제 프로젝트에서 개발자는 URL 암호화 또는 서명과 같은 다른 목적으로 crypt ()를 사용하려고 시도 할 수 있습니다. 이 기사는 crypt () 함수가 URL 암호화 또는 서명에 적합한 지 여부와 이와 관련하여 보안 및 효과를 분석합니다.
crypt () 함수는 일원 암호화의 함수입니다. 다른 알고리즘 (예 : DES, MD5, Blowfish, SHA-256, SHA-512)을 기반으로 입력 문자열을 해시합니다. 일반적인 사용법은 다음과 같습니다.
$hash = crypt("password", '$6$rounds=5000$usesomesillystringforsalt$');
함수의 두 번째 매개 변수는 "Salt"이며, 이는 해싱 프로세스 동안 알고리즘을 결정하고 출력에 영향을 미치는 역할을합니다.
암호화는 원래 컨텐츠를 복원 할 수 있으며 Crypt ()는 돌이킬 수없는 해시 함수입니다. crypt ()를 사용하여 URL (예 : https://m66.net/download/file?id=12345 )을 처리하면 결과가없는 해시 문자열입니다. 예를 들어:
$url = "https://m66.net/download/file?id=12345";
$hash = crypt($url, '$6$rounds=5000$somesaltvalue$');
이 코드는 해시 값 문자열을 생성하지만 원래 URL을 복원 할 수는 없습니다. 따라서 crypt ()는 암호화 도구로 적합하지 않습니다.
crypt () 는 본질적으로 일원 해시 함수이며 이론적으로 시그니처 도구로 사용할 수 있지만 실제로는 권장되지 않습니다. 이유는 다음과 같습니다.
소금 가공은 통제 할 수 없습니다 . 소금 값을 직접 생성하고 저장해야합니다. 그렇지 않으면 서명을 확인할 수 없습니다. 동적 소금 값을 사용하면 동일한 입력에 대해 다른 출력이 발생하여 서명 검증이 없습니다.
크로스 플랫폼 검증되지 않음 : 다른 시스템은 특히 특정 알고리즘 (예 : SHA-512)을 사용할 때 Crypt ()를 다르게 구현할 수 있습니다. 호환성 문제가 발생할 수 있습니다.
출력 형식은 복잡하고 URL에 적합하지 않습니다 . 생성 된 해시 문자열에는 / 및 $ 와 같은 특수 문자가 포함될 수 있으며 추가 인코딩은 URL 매개 변수에 사용되어야하므로 복잡성을 증가시킵니다.
$signed = urlencode(crypt($url, '$6$somesaltvalue$'));
// 링크 예제:https://m66.net/download/file?id=12345&sig=HASH_STRING
진정성을 확인할 수 없음 : crypt () 의 필수 목표는 비밀번호 검증이며 데이터 무결성을 보장하지 않습니다. HMAC와 비교하여 서명 검증 프로세스에서 메커니즘 지원이 부족합니다.
무결성과 변조 방지를 위해 URL에 서명 해야하는 경우이 시나리오를 위해 설계된 Hash_hmac () 함수를 사용하는 것이 좋습니다.
$url = "https://m66.net/download/file?id=12345";
$secret = "my_secret_key";
$signature = hash_hmac('sha256', $url, $secret);
$signedUrl = $url . "&sig=" . $signature;
// 검증 중에 다시 계산하십시오 hash_hmac(url, secret) 비교를 수행하십시오
서버가 키를 저장한다면 HMAC 서명은 대칭입니다. 이 방법은 데이터가 변조되지 않았을뿐만 아니라 크로스 플랫폼 검증에도 적용됩니다.
crypt () 함수는 URL의 암호화에 적합하지 않습니다. 비가 역적 해시 함수이며 원래 데이터를 복원 할 수 없기 때문입니다. 동시에 보안, 호환성 및 유연성이 HMAC와 같은 전문 도구만큼 좋지 않기 때문에 URL 서명에는 적합하지 않습니다. URL 서명 또는 검증 시나리오와 관련하여 데이터 무결성 및 보안을 보장하기 위해 Hash_hmac () 또는 기타 암호화 라이브러리 (예 : OpenSSL_SIGN () )을 사용하는 것이 좋습니다. URL 암호화 요구 사항의 경우 Crypt () 대신 대칭 또는 비대칭 암호화 알고리즘 (AES, RSA)을 구현해야합니다.