복호화가 불가능한 걸로 알고 있습니다.
복호화가 가능할려면 Key가 있어야 하는데, Key가 있으면 또 그 Key는 어떻게 관리해야 하는가 하는 문제가 생기죠.
(그 Key가 노출된다면 모든 비밀번호가 노출되는게 됩니다 -> 보안의 취약점)
그래서, 비밀번호 같은 경우에는 복호화가 가능한 암호화가 아니라,
단방향 암호화(보통 Hash 함수 같은 걸 많이 씁니다)를 해서, 복호화가 불가능하게 저장합니다.
Netscape LDAP의 경우 userPassword에서 UNIX Crypt나 SHA-1 알고리즘으로 단방향 암호화해서 저장하는 걸로 알고 있습니다.(옵션으로 선택 가능)
암호를 확인하는 방식은 2가지가 있는데, 보통 첫번째 방법을 씁니다.
첫번째는 Bind를 시도해서 성공여부로 인증을 하는 겁니다.
해당 사용자의 ID/PW로 LDAP에 Bind해서 LDAP_SUCCESS가 떨어지면 비밀번호가 맞다고 보는 거죠.
그런데, 이경우 보통 사용자는 ID정보만 입력하지만 실제 LDAP에 BIND할때는 DN을 사용하게 됩니다.
그래서, 보통은 Anonymous나 관리자로 LDAP에 bind해서 해당 id를 검색하여 해당 id가 존재하는지 여부를 판단한후 그 id에 해당하는 DN을 가져온 후 다시 DN과 사용자가 입력한 비밀번호로 bind를 시도해서 성공여부를 확인하는 거죠.
1. 관리자로 Bind
2. ldap_search( ..., "(uid=xxx)", ... );
3. ldap_get_dn()
4. ldap_bind( DN, 비밀번호, )
-> SUCCESS : 인증성공
5. ...
(*) 주의 : LDAP API 에서 비밀번호나 ID 중 하나가 NULL인 경우 무조건 Anonymous bind로 인식하기 때문에 사용자가 입력한 비밀번호가 NULL이 아닌지 반드시 사전에 체크해야 합니다.
두번째는 LDAP에서 위의 UNIX Crypt나 SHA-1 중 어느 알고리즘으로 되어 있는지 확인한 후 사용자가 입력한 비밀번호를 같은 알고리즘으로 단방향 암호화 한 후에 LDAP에 있는 userPassword랑 비교하는 거죠.
여기서 주의할 점은 Netscape LDAP의 경우 userPassword를 ldap_get_value()할 경우,
암호화 방식에 따라 {CRYPT}나 {SHA}라는 문자라 딸려 오기 땜에 반드시 이부분을 떼어낸 값이랑 비교해야 합니다.
그럼...
>>lriss 님께서 쓰시길<<
:: ldap에서 기본적으로 지원하는 attribute 중 하나인 userpassword를 기본적으로 제공하는 암호화 방
:: 식으로 암호화를 시켰는데 나중에 복호화를 시켜서 보거나 비교를 할려면 어떻게 해야 합니까? 메소드
:: 를 지원하지는 않는지요? jndi로 구현을 할려고 하는데 어떻게 해야 할지 몰라서 글을 올립니다.
:: 답변 부탁 드립니다.
|