본문 바로가기
개발

PHP에서 crypt() 함수는 무엇인가???

by 비손 2011. 8. 24.

저도 모두 정확히 안다고 할 순 없지만~ 대충이나마 설명을 적어 봅니다.
본 문서는 해쉬 알고리즘의 개념을 알고 있다는 가정 하에 작성되었습니다.

암호화 알고리즘을 찾다보니 crypt를 이용하는게 제일 낫겠다 싶은 생각이 들었습니다. 그럼 대체 이건 뭔가 알고 써야겠죠?

MD5에 대해 먼저 생각해 봅시다.

해쉬 알고리즘 중 하나인 MD5는 얼마나 안전할까요??
처음엔 안전했지만 이제와서는 그다지 안전하지 않게 되어버린 것 같습니다.
단방향 함수로 나온 MD5는 역방향 함수가 없을 거예요.. 아마.. 누군가 만들었을 수도 있겠죠? ㅋ

그런데, MD5로 암호화 한 암호문은 무작위 대입으로 찾아낼 수 있습니다.
평문 자체가 단순하면, 그만큼 더 빨리 찾아내겠죠~ 찾는 방법이 무작위 대입법이기 때문에~
이미 평문과 암호문을 대조해 놓은 테이블을 만드는 프로젝트도 있죠. 레인보우 테이블....

우리가 만드는 모든 암호문에 대한 대조 테이블이 미리 만들어져 있다면, 큰일이네...

그래서 Salt를 붙이는 방법이 사용되었습니다.
Salt란 '평문'에 복잡한 문자열을 붙인 후 해싱을 하도록 하는 문자열 입니다.
Salt를 복잡하게 만들면, 레인보우 테이블에 미리 만들어져있지 않겠죠??

예를들어 'test'의 MD5 결과값은 '098f6bcd4621d373cade4e832627b4f6'입니다.
여기에 '3$%cdf3D'라는 salt를 붙이면
'3$%cdf3Dtest'의 결과값은 '37bd669acc249b35287af02d15064a45'입니다.

둘 다 암호문을 평문으로 만들기는 어렵습니다.
하지만 무작위 대입으로 했을 때는 해독 시간이 엄청나게 차이가 날 것입니다.

이런 salt를 자동으로 만들어 주는 함수 cypt()

crypt('password');
이렇게만 입력하면 자동으로 salt를 붙여서 암호문을 만들어줍니다.
그것도 그냥 만드는게 아니라 적당히 꼬아서 만들어 주더군요
MD5인코딩 한거에다가, base64_encoding을 하고 거기에 문자열도 뒤집고, 문자열 대치도 하고 해서 이상한 문자열을 만들어 줍니다.
게다가 salt 값이 계속해서 바뀌기 때문에 그냥 crypt 함수만 사용하면 계속해서 결과값이 바뀌게 되어 있습니다.

지금 crypt('test')를 한 결과값은 $1$nzrg2LMv$tHkYvfZrZkviR5bXP28670 네요~
그리고 이건 호출할 때마다 바뀝니다.

어??? 그럼 암호로 이 문장을 저장해 두면 매번 바뀌니까 비교가 불가능하지 않겠습니까??
위 문장 중 앞부분(보라색)은 salt입니다. 그래서 그 salt값을 넣고 같은 평문을 넣으면 동일한 암호문이 나오게 되어 있죠~

crypt('test','$1$nzrg2LMv$') 를 호출하면 위와 동일한 결과가 나옵니다.

그리고 뒤에 붙는 문자열을 함께 넣어도 됩니다. 즉..

crypt('test','$1$nzrg2LMv$tHkYvfZrZkviR5bXP28670') 를 호출해도 동일한 결과가 나오는 것이죠~

그럼 결국 암호를 비교하는 작업은 어떻게 하는 것인가??

$pass = crypt('test');

if(crypt('test',$pass) == $pass) {
    echo("암호 일치");
}

이렇게 하면 됩니다. 간단하죠??? ㅋ crypt 함수의 내용을 더 확인하고 싶다면 클릭