On 13/03/2019 08:07, 이승윤(파트너) - 플랫폼담당인프라개발2팀 wrote:
Thank you for contributing LDAP API!!
Thanks for using it !
I have a question about connection bind!
Answer embedded. Note that I'm stressing out some very basic points you
may perfectly know, but as this is a public mailing list, that may
clarify things for other users too, so please don't feel like this is a
lecture, it's not...
http://directory.apache.org/api/five-minutes-tutorial.html
Simple bind
The most common bind uses an identifier and a password. The identifier must be
a DN, and the password can be encrypted. Here is an example of a bind operation
:
// Don't do that ! Password in clear text = danger !
connection.bind( "ou=example, dc=com", "secret" );
No. There is *nothing* wrong passing a password as a String to a remote
server, assuming the communication between the client and the server is
secured (aka encrypted). Use SSL/TLS.
// The password is encrypted, but it does not protect against a MITM attack
connection.bind( "ou=example, dc=com", "{crypt}wSiewPyxdEC2c" );
What's the point of sending the hash value of your password to a remote
server, which is likely to store it hashed anyway ? ( and yes, none of
the two piece of code protect you against a MITM attack. Use a secured
connection).
At this point, I think you totally misunderstood what are the key
principles of password usage. Let me give you some elements:
* a password's hash is a one-way function that takes a password as an
input and generate a hash out of it. There is no way you can recover the
password out of this hash, the only thing you could do is to get some
collision (ie find some passwords that produces the same hash value).
The hash function is critical here: it should generate pretty random
hashes, regardless of the password complexity, and it should not be too
fast to slow down a rainbow attack or a brute force attack.
* you should *NEVER* *EVER* store a clear text password *IN A SERVER*.
*NEVER*. Always store a hash value.
* Use salted versions of algorithm that propose some (SSHA instead of
SHA, or crypt : https://en.wikipedia.org/wiki/Crypt_(C))
* If your client is going to bind on a remote LDAP server using
credentials, then *ALWAYS* do so over a secured connection (LDAPS or use
the startTLS extended operation)
* don't *EVER* code a password as a hard coded string in your code. Make
it a parameter that is read from a configuration file, or as an user
input. Of course make sure that your filesystem is secured (aka
encrypted) when you store passwords in files...
That being said, the reason it does not work with LDAP when you use
"{crypt}wSiewPyxdEC2c" as a password is that the server will recognize
the {crypt} at the very beginning of a stored password as a marker for
some hashed password.
Ldap Server storage:
[on server] <Dumy, userPassword: "{crypt}wSiewPyxdEC2c"> -> means the
password (say, "MySecret") has been hashed to "wSiewPyxdEC2c" using the
'crypt' algorithm, which is concatenated to the hash value, for later
use when the client tries to bind.
Client binding :
[client] Bind( Dummy, "MySecret" ) -> [Server] -> "Ok, I received a Bind
request for user Dummy, let's fetch his/her password" ->
{crypt}wSiewPyxdEC2c -> "Ok, this starts with "{crypt}", I must hash the
received password -> crypt( "MySecret") -> "wSiewPyxdEC2c" -> "Ok, now
compare the computed hash password of "MySecret" with the stored value :
compare( "wSiewPyxdEC2c", "{crypt}wSiewPyxdEC2c" ) -> "Ok, let's remove
'{crypt}' from the stored password" -> hashes are equal, this is the
correct password, let's allow the user !
Hope it clarifies things...