PHP의 sha1() 함수는 문자열의 SHA-1 해시값을 계산할 때 사용됩니다. 함수를 본격적으로 살펴보기 전에, SHA-1이 무엇인지 먼저 간단히 짚어보겠습니다.
미국 안전 해시 알고리즘 1(US Secure Hash Algorithm 1)은 아래와 같이 정의됩니다.
"SHA-1은 메시지 다이제스트(message digest)라 불리는 160비트 출력을 생성합니다. 생성된 메시지 다이제스트는 예를 들어 서명 알고리즘에 입력되어 해당 메시지에 대한 서명을 만들거나 검증하는 데 활용될 수 있습니다. 메시지 전체 대신 메시지 다이제스트에 서명하면, 다이제스트의 크기가 일반적으로 원본 메시지보다 훨씬 작기 때문에 처리 과정의 효율성이 향상됩니다. 또한 디지털 서명을 검증하는 쪽에서는 반드시 서명 생성자가 사용한 것과 동일한 해시 알고리즘을 사용해야 합니다."
-- 참고 자료: RFC 3174
문법(Syntax)
sha1(str, raw)
매개변수(Parameters)
str − 해시를 계산할 대상 문자열입니다. 필수 항목입니다.
raw − 출력 형식을 16진수로 할지 바이너리로 할지 지정하는 불리언(Boolean) 값입니다. 선택 사항입니다.
TRUE − 20자 길이의 원시(raw) 바이너리 형식으로 출력합니다.
FALSE − 기본값으로, 40자 길이의 16진수 형식으로 출력합니다.
반환값(Return Value)
sha1() 함수는 성공 시 계산된 SHA-1 해시 문자열을 반환하며, 실패할 경우 FALSE를 반환합니다.
예제 1: 기본 사용법
다음은 문자열의 SHA-1 해시를 계산하는 기본적인 예제입니다.
<?php $s = "Welcome"; echo sha1($s); ?>
출력 결과
ca4f9dcf204e2037bfe5884867bead98bd9cbaf8
예제 2: 해시값 비교하기
다음 예제는 계산된 해시값을 특정 값과 비교하여 문자열이 동일한지 확인하는 방법을 보여줍니다.
<?php
$s = "Welcome!";
echo sha1($s);
if (sha1($s) == "ca4f9dcf204e2037bfe5884867bead98bd9cbaf8") {
echo "<br>Hello Welcome!";
exit;
}
?>출력 결과
e52e5e6cd50ef4de30d8a4fafbbfab41180cc200
위 결과에서 볼 수 있듯이, 문자열에 느낌표(!) 하나만 추가되어도 전혀 다른 해시값이 생성됩니다. 이처럼 SHA-1은 입력값이 조금만 달라져도 완전히 다른 결과를 내는 눈사태 효과(avalanche effect)를 보입니다.
참고 사항
SHA-1은 데이터 무결성 검증 등 비교적 단순한 용도에는 여전히 사용되지만, 충돌(collision) 취약점이 발견된 이후 보안 목적으로는 더 이상 권장되지 않습니다. 따라서 비밀번호 저장과 같은 보안이 중요한 작업에는 password_hash() 함수나 bcrypt, Argon2 같은 최신 알고리즘을 사용하는 것이 좋습니다.