월별 글 목록: 2015년 6월월

PHP에서 MD5 사용하기

MD5는 128비트 암호화 해시 기법입니다. 아주 오래된 기술이고, 속도가 아주 빠르고, 보안에 아주 취약합니다. 그래서 더 이상 암호화 방식에 사용되는 것은 권장되지 않습니다. 아직도 MD5를 이용해 암호화를 하는 곳이 있다면 최대한 빨리 암호화 방식을 개선하는게 좋습니다. 다만 암호를 저장하는 목적 외로는 많이 사용되는데요, 대표적으로 파일의 무결성 검사에 많이 사용됩니다.

최근에는 기술이 좋아져서 파일을 다운로드 받으면서 파일이 깨질 걱정을 하지 않아도 되지만, 과거에는 파일이 깨져서 다운로드 되는 경우가 종종 있었습니다. 혹은 파일이 전파되는 과정에서 누군가가 악성코드를 심은 다음 배포를 시작하는 경우도 있었고요. 지금도 토렌트 같은 툴을 이용해서 받았을 때에는 파일이 온전한지와 완전한지에 대해서 확인이 필요한 경우가 있습니다.
그럴 때 파일을 확인할 수 있는 방법이 파일의 checksum hash를 이용하는 방법이고요, 올드 유저나 헤비 다운로더라면 들어보신 적이 있을겁니다.

cat

위의 이미지 파일을 md5로 해싱하면 728f3cfe66735370c87414abc88dc35b 라는 결과가 나옵니다. 이 이미지는 파일의 바이너리를 해싱하는 것이므로 몇번을 해싱해도 항상 같은 값이 나옵니다. 하지만 이 파일을 다시 인코딩 하게 되면 파일 자체가 변환되므로 다른 해시값이 나오게 됩니다. 무결성 검사란 이런 것입니다.

md5_file 함수를 이용하면 쉽게 서버상에 있는 파일에 대한 해시값을 얻을 수 있습니다.

$hash = md5_file( './cat.jpg' );
// 현재 디렉토리의 cat.jpg 에 대한 해시값을 얻습니다.
echo $hash;

사용자가 업로드한 파일는 임시 폴더상에 존재하고, 임시 폴더의 임시 파일도 당연히 해싱할 수 있습니다.

$hash = md5_file( $_FILES[ 'file' ][ 'tmp_name' ] );
echo $hash;

Laravel을 이용한다면 파일의 바이너리 자체를 얻어온 후 해싱해서 값을 얻을 수 있습니다.

$file = Request::file( 'file' ); // 업로드한 파일의 정보를 얻어옵니다.
$content = File::get( $file ); // 파일의 바이너리 자체를 얻어옵니다.
$hash = md5( $content ); // md5() 함수로 바로 해싱합니다.
echo $hash;

파일의 체크섬을 이용해서 동일 이미지에 대한 처리를 한다든가, 파일의 변조 여부를 확인한다든가, 많은 응용이 가능해집니다. 다른 포스트에서 그런 부분들은 차차 이야기 해보도록 하겠습니다.