I’m using crypt() encryption in PHP like this:
<?php
$password = sanitizing_func($_POST['password']);
$var = crypt($password, 'ab');
?>
How Secure is this?
Found a better solution here: openwall phpass
Thanks to Edward Thomson
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
It’s less secure than if you just use
cryptthe way it was designed, with the password as the first argument and the salt as the second.Now you’re encrypting known plaintext using the user’s password as the salt. If your system uses an MD5
crypt, then you’ve just limited the salt space to 12 characters, so you’re truncating the space of users passwords to twelve characters. Worse still, my system requires me to use a prefix on the salt in order to specify my crypt, or else I get old schoolcrypt, meaning you have two characters for the salt. So you’ve limited the possible length of a users password to two characters. Plus there’s no point in even runningcryptat this point, you might as well just store their two character password, since the salt is prefixed to the ciphertext so that subsequent calls tocryptcan pass the same salt.Also, you’re limiting the character space of the password by using it in the salt, since the character space of the salt is limited to A-Z, a-z, 0-9, “.”, “/”. Even if you switch the arguments around from your code example, you’re using the same salt data for every call. This means that every password has the same salt. So if your password table is exposed, it becomes less computationally expensive to crack using a dictionary attack.
In other words, swapping the password and salt arguments is a fatal mistake.
Finally, there’s simply no reason to call crypt twice. If you want better encryption, use a better algorithm, don’t call it more frequently. For example, if you’re using a DES crypt, then it’s still an ancient algorithm no matter how many times you call it. (I also seem to remember reading that multiple passes of an algorithm may inadvertently produce weakened ciphertext. But I don’t have Schneier in front of me.)
What you want to do is the industry standard: use a strong crypt, pass the password as the first argument and random salt data in as the second argument and make sure that you’re passing the maximum allowable number of bytes in for the salt.