단방향 암호화란? 평문으로 암호화할 수 있어도 암호화된 암호문을 평문으로 복원할 수 없는 비가역적 암호화를 말합니다. 다시 말해 복원이 불가능한 상태입니다.

평 문 암호화 복호화
양방향 test 098f6bcd4621d373cade4e832627b4f6 test 가역적
단방향 test 098f6bcd4621d373cade4e832627b4f6 비가역적

일반적으로 단방향 암호화는 실제 많이 사용하는 방법이며, 특히 php 유저는 md5 알고리즘을 널리 사용합니다. 이 방법은 암호화하고자 하는 문자열을 받아 128비트로 된 값을 만들어 낸다고 합니다.

문제는 md5 알고리즘도 보안의 허점에 노출되는 등 보안 강화가 필요한 현 시점에 진보된 해쉬 알고리즘이 필요합니다. 현재 문제시 되는 단순히 숫자로만 이루어져 있거나 영문, 숫자로 이루어져 있더라도 암호길이가 짧아 보안에 취약합니다.

짧은 암호는 해독에 걸리는 시간이 그리 길지 않습니다. 그 만큼 컴퓨터의 성능 또한 진보했으니까요.

진보된 알고리즘을 이용해 암호화하여 디비에 저장하되, 사용자가 로그인에 사용될 패스워드를 저장하는 것 만큼 중요하게 다뤄야 하는데, 숫자, 영문자를 포함하여 9자 이상 패스워드를 입력하게 하고, md5 에 임의의 값을 더한 값에 sha1 이나 sha512 와 같은 알고리즘으로 한번 더 암호화하여 저장하도록 합니다.

간단한 암호를 사용하는 것은 브루트 포스 공격(brute force attack)의 공격 대상이 되는 만큼 위험합니다.

브루트 포스 공격이란? 무차별 대입공격이란 뜻으로 성공할 때까지 가능한 모든 조합의 경우의 수를 시도해 원하는 공격을 시도하는 것으로 대표적인 예로 크렉 등 소프트웨어를 이용하여 password를 추측하는 방법입니다.

대표적인 공격 프로그램으로는 무식하게 password를 다양하게 대입하는 것과 사전을 통해 공격 시도하는 Brutus 프로그램이 있습니다. 특별한 해시 알고리즘을 사용한다 하더라도 로그인 시도 실패 횟수 초과시 강제적으로 로그인 시도를 제한하는 방법 또한 좋은 예입니다.


hash 함수

hash ( string $algo , string $data [, bool $raw_output= false ] ) (PHP 5 >= 5.1.2, PECL hash >= 1.1)

요즘은 리눅스나 공인인증서 등 암호화가 필요한 곳에 보다 진보된 해시로 많이 교체되고 있습니다. 대략 해시 종류는 다음 표를 참고하면 됩니다.

해 시 자릿 수
md2 32
md4 32
md5 32
sha1 40
sha224 56
sha256 64
sha384 96
sha512 128
ripemd128 32
ripemd160 40
whirlpool 64
tiger128,3 80
tiger160,3 128
tiger192,3 32
tiger128,4 40
tiger160,4 48
tiger192,4 32
snefru 40
gost 48
adler32 64
crc32 64
crc32b 64
haval128,3 8
haval160,3 8
haval192,3 8
haval224,3 128
haval256,3 128
haval128,4 32
haval160,4 40
haval192,4 48
haval224,4 56
haval256,4 64
haval128,5 32
haval160,5 40
haval192,5 48
haval224,5 56
haval256,5 64

문자열 'test'를 md5 로 암호화하고, 한번 더 암호화 해줍니다.

<?php
 echo hash('sha512', 'passwd_' . hash('md5', 'test'));
?>

다음 예제로 다양한 해시 알고리즘의 결과를 확인할 수 있습니다.

<?php  
 $data = "test";  
 foreach (hash_algos() as $v) {  
        $r = hash($v, $data, false);  
        printf("%-12s %3d %s\n", $v, strlen($r), $r);  
 }  
 ?>


단방향 sha1 함수

만약, php 5.1.2 이하 버전이라면, sha1 함수를 사용해도 됩니다. 분명 md5 보다는 진보된 함수입니다.

string sha1 ( string $str [, bool $raw_output ] ) (PHP 4 >= 4.3.0, PHP 5)

선택적인 raw_output 를 TRUE로 설정하면, 길이 20 인 바이너리 형식의 sha1 해시를 반환합니다. 기본값은 FALSE입니다.

<?php
 $str = 'apple';
 if (sha1($str) === 'd0be2dc421be4fcd0172e5afceea3970e2f3d940') {
    echo "Would you like a green or red apple?";
 }
 ?>

패스워드 뿐 아니라 아이디 역시 영문, 숫자를 강제적으로 포함하게 하여 보안을 강화시켜야 하고, 로그인 시도 실패 횟수를 제한해 둘 필요가 있습니다.

0 댓글