본문 바로가기
데이터베이스/MSSQL

서버에서 제공하는 Password 암호화 함수

by 브래드.권 2009. 1. 16.



MSSQL 2000 버전부터 서버 자체적으로 PwdEncrypt() 라는 Password 암호화 함수와 암호화된 Password를 판별할 수 있게 해주는 PwdCompare() 함수를 제공하고 있습니다.

이 두 함수들은 문서화되지 않은 함수이기 때문에 어떻게 사용해야 하는지에 대한 설명이 없습니다.
그렇지만 원래 MSSQL 에서 사용자의 패스워드를 저장할 때 사용하던 함수라고 하기 때문에

master.sysusers password 필드 데이터 타입과 같은 varbinary(256)으로 하면 될 것 같습니다.

일단, PwdEncrypt() 함수의 사용 예제를 보면,



 위와 같이 1234를 함수를 이용해 암호화하면 16진수값이 나오게되는데요. 위의 문장을 여러번 실행하면 그때마다 나오는 결과값이 달라지는걸로보아 알고리즘이 TimeStamp 값을 이용하는것 같네요.

아무튼 이렇게 암호화된 함수를 varbinary(256) 데이터타입의 필드에 저장하고나면 이 함수는 복호화를 제공하지 않기때문에 본인이 아닌 이상은 암호가 무엇인지 쉽게 알수 없을것 같네요.

그리고 원문의 길이에 상관없이 30~35자 사이의 거의 일정한 길이의 암호문을 출력하고, 원문의 길이가 varchar 기준으로 128자를 넘으면 에러를 발생시킵니다.

이제 암호화된 패스워드를 비교하기 위해 PwdCompare() 함수의 사용 예제를 보면,




PwdCompare 함수는 PwdCompare(비교할 패스워드, 저장된 패스워드) 와 같은 인자값을 가지며,
두개가 일치하면 1을 일치하지 않으면 0을 반환합니다. 이 반환값을 가지고 패스워드를 체크하면 될 것 같네요.
패스워드를 비교할 때 대소문자는 구별하지 않습니다. 

단점으로는, 복호화가 되지 않고, 원문의 길이와 상관없이 길이가 고정되므로 테이블의 크기가 커져서 불필요한 공간낭비가 심각해지고, 쿼리하기 위해 모든 암호화 값을 decryption 해야 하므로 오버헤드가 커지며, where 절에서 비교하기 전에 변형이 발생할 수 밖에 없으므로 인덱스를 전혀 사용할 수 없게 되며, 향후 버전에서 undocumented SP는 변경될 여지가 높으므로 사용한다면 사용자의 데이터 중 password 필드 정도만 사용하는게 좋을 것 같습니다.  그리고 pwdencrypt() 와 pwdcompare() 에 대한 buffer overflow 버그가 있다는 보고가 있었으므로 반드시 관련 패치를 하시기 바랍니다.