PHP crypt() 함수
정의와 사용법
crypt() 함수는 DES, Blowfish 또는 MD5 알고리즘으로 암호화된 문자열을 반환합니다.
다른 운영 체제에서는 이 함수의 동작이 다릅니다. 일부 운영 체제는 하나 이상의 알고리즘 유형을 지원합니다. 설치 시 PHP는 사용할 수 있는 알고리즘과 어떤 알고리즘을 사용할지 확인합니다.
구체적인 알고리즘은 salt 매개변수의 형식과 길이에 따릅니다. 특정 암호화 메서드로 생성된 특정 문자열의 수를 늘리면 salt를 통해 암호화가 더 안전해집니다.
여기에는 crypt() 함수와 함께 사용되는 몇 가지 상수가 있습니다. 이 상수 값은 설치 시 PHP에서 설정됩니다.
상수:
[CRYPT_SALT_LENGTH] | 기본 암호화 길이입니다. 표준 DES 암호화를 사용하여 길이가 2입니다. |
[CRYPT_STD_DES] | 표준 DES 알고리즘을 기반으로 해시는 "./0-9A-Za-z" 문자 중 두 문자를 소금 값으로 사용합니다. 소금 값에서 불법 문자를 사용하면 crypt()가 실패합니다. |
[CRYPT_EXT_DES] | DES 알고리즘을 기반으로 확장된 해시입니다. 소금 값은 9자리 문자열로, 1개의 밑줄 뒤에 4바이트 반복 횟수와 4바이트 소금 값으로 구성됩니다. 이들은 출력 가능 문자로 인코딩되며, 각 문자는 6비트로, 유효 비트가 가장 적은 것이 우선됩니다. 0에서 63은 "/./0-9A-Za-z"로 인코딩됩니다. 소금 값에서 불법 문자를 사용하면 crypt()가 실패합니다. |
[CRYPT_MD5] | MD5 해시는 "$1$"으로 시작하는 12자 문자열 솔트를 사용합니다. |
[CRYPT_BLOWFISH] | Blowfish 알고리즘은 "$2a$", 두 자리 cost 파라미터, "$" 및 "./0-9A-Za-z"의 문자로 구성된 64비트 문자열로 사용되는 솔트를 사용합니다. 솔트에서 이 범위 이외의 문자를 사용하면 crypt()가 빈 문자열을 반환합니다. 두 자리 cost 파라미터는 2의 지수로 반복 횟수를 나타내며, 범위는 04-31입니다. 이 범위를 벗어나면 crypt()가 실패합니다. |
CRYPT_SHA256 | SHA-256 알고리즘은 $5$으로 시작하는 16자 문자열 솔트를 사용하여 해시합니다. 솔트 문자열이 "rounds=<N>$"로 시작하면, N의 숫자 값이 해시 반복 횟수를 지정합니다. 이는 Blowfish 알고리즘의 cost 파라미터와 비슷합니다. 기본 반복 횟수는 5000으로, 최소는 1000, 최대는 999,999,999입니다. 이 범위를 벗어난 N은 가장 가까운 값으로 변환됩니다. |
CRYPT_SHA512 | SHA-512 알고리즘은 $6$으로 시작하는 16자 문자열 솔트를 사용하여 해시합니다. 솔트 문자열이 "rounds=<N>$"로 시작하면, N의 숫자 값이 해시 반복 횟수를 지정합니다. 이는 Blowfish 알고리즘의 cost 파라미터와 비슷합니다. 기본 반복 횟수는 5000으로, 최소는 1000, 최대는 999,999,999입니다. 이 범위를 벗어난 N은 가장 가까운 값으로 변환됩니다. |
이 함수가 여러 알고리즘을 지원하는 시스템에서는 위의 상수가 지원되면 "1"으로 설정하고, 그렇지 않으면 "0"으로 설정합니다.
비고:해독 함수가 없습니다. crypt() 함수는 일방적인 알고리즘을 사용합니다.
문법
crypt(str,salt)
파라미터 | 설명 |
---|---|
str | 필수. 암호화할 문자를 정의합니다. |
salt | 선택 사항. 암호화된 문자 수를 늘려 더 안전하게 만드는 문자열입니다. salt 파라미터가 제공되지 않으면 매번 함수 호출 시 PHP가 랜덤으로 생성합니다. |
기술 세부 사항
반환 값: | 암호화된 문자열이나 13자 미만의 문자열을 반환하여 실패 시 솔트와 구분할 수 있도록 합니다. |
PHP 버전: | 4+ |
업데이트 로그
버전 | 설명 |
---|---|
5.3.2 | Ulrich Drepper의 구현을 기반으로 SHA-256 알고리즘과 SHA-512 알고리즘을 추가한 crypt. |
5.3.2 | Blowfish 알고리즘의 불법 순환 문제를 수정하여 "실패" 문자("*0" 또는 "*1")를 반환하고, DES 알고리즘을 사용하지 않도록 했습니다. |
5.3.0 | PHP는 자체 MD5 Crypt 구현을 포함하고 있으며, 표준 DES 알고리즘, 확장된 DES 알고리즘 및 Blowfish 알고리즘을 포함하고 있습니다. 시스템에 해당 구현이 부족하다면 PHP는 자체 구현을 사용합니다. |
실제
예제 1
이 예제에서는 다양한 알고리즘을 테스트할 것입니다:
<?php // 두 문자 salt if (CRYPT_STD_DES == 1) { echo "표준 DES: ".crypt('something','st')."\n<br>"; } else { echo "표준 DES 지원되지 않음.\n<br>"; } // 4 문자 salt if (CRYPT_EXT_DES == 1) { echo "확장된 DES: ".crypt('something','_S4..some')."\n<br>"; } else { echo "확장된 DES 지원되지 않음.\n<br>"; } // $1$으로 시작하는 12 문자 if (CRYPT_MD5 == 1) { echo "MD5: ".crypt('something','$1$somethin$')."\n<br>"; } else { echo "MD5 지원되지 않음.\n<br>"; } // $2a$으로 시작하는 Salt. 두 자리 수의 cost 매개변수: 09. 22 문자 if (CRYPT_BLOWFISH == 1) { echo "Blowfish: ".crypt('something','$2a$09$anexamplestringforsalt$')."\n<br>"; } else { echo "Blowfish DES 지원되지 않음.\n<br>"; } // $5$으로 시작하는 16자리 salt. 기본 회전수는 5000입니다. if (CRYPT_SHA256 == 1) { echo "SHA-256: ".crypt('something','$5$rounds=5000$anexamplestringforsalt$')."\n<br>"; else { echo "SHA-256가 지원되지 않습니다.\n<br>"; } // $5$으로 시작하는 16자리 salt. 기본 회전수는 5000입니다. if (CRYPT_SHA512 == 1) { echo "SHA-512: ".crypt('something','$6$rounds=5000$anexamplestringforsalt$'); } else { echo "SHA-512가 지원되지 않습니다."; } ?>
위의 코드의 출력(운영 체제에 따라 다름):
표준 DES: stqAdD7zlbByI 확장된 DES: _S4..someQXidlBpTUu6 MD5: $1$somethin$4NZKrUlY6r7K7.rdEOZ0w. Blowfish: $2a$09$anexamplestringforsaleLouKejcjRlExmf1671qw3Khl49R3dfu SHA-256: $5$rounds=5000$anexamplestringf$KIrctqsxo2wrPg5Ag/hs4jTi4PmoNKQUGWFXlVy9vu9 SHA-512: $6$rounds=5000$anexamplestringf$Oo0skOAdUFXkQxJpwzO05wgRHG0dhuaPBaOU/ oNbGpCEKlf/7oVM5wn6AN0w2vwUgA0O24oLzGQpp1XKI6LLQ0.