Convincing you to do it wrong (PHP and unsalted passwords)
blog.jrock.us
blog.jrock.us
Every other site on the planet can start encrypting, using salts, hashing, etc, but the site that will be attacked is the site that emails back passwords to their users in plain text when they use the "forgot my password" page.
Why would a hacker waste their time elsewhere? They will create an account, use the "forgot" form, and if they get their password back in plain text, they know they have a target rich database.
The ONLY true form of password protection once again lies in the hands of the USER who MUST create different passwords at every site if they really want their identity protected. Sorry. If you don't know how to keep your passwords in a protected database on your PC, learn.
After all, if a hacker is already in the database stealing passwords, they've got your data too if they want it. Might as well spend your time protecting your identity elsewhere.
-it's too easy to take sample code off the web, and it's easier to take exactly what you want rather than some general pseudo code written by BSchneier
and
-it works until it doesn't
So is this a rant about abstraction or security? It is possible to make the original example safer without using abstraction. But the abstraction is important to make the applogic neater...
I feel like the author is making 2 separate points at the same time - and confusing them slightly.
"His language convinced him to do it wrong, and now he is pretty much stuck. And that's bad."
PHP doesn't convince you to roll-your-own over use-someone-else's. The author could have just as looked to use PEAR as you looked to use CPAN.
http://pear.php.net/packages.php?catpid=1&catname=Authen...
http://pear.php.net/manual/en/package.authentication.auth-ht...
And anyway, I don't see a bcrypt implementation there. People will do what's easy; if it's as easy to do the (significantly more secure) bcrypt, they will. If it's easiest to do an unsalted MD5 digest, they will.
Someone certainly could write a library exactly like Authen::Passphrase for PHP or Ruby or whatever; but they haven't, so people do it wrong. They have gotten used to not having libraries, so they don't even look. (They search for blogs instead, and cut-n-paste years-old code. The culture practically insists on it.)
Still a horrible API, though. (How do you control which algorithm will be used? How do you model "this password is the lack of a password"? Etc., etc.)
So if you want Blowfish, you'll need to supply a sixteen-character salt. What exactly do you mean by "this password is the lack of a password"?
Edit: is http://search.cpan.org/~zefram/Authen-Passphrase-0.006/lib/A... what you're talking about?
His post about PHP and security is flaming a line of example code extracted from an article on an introduction to Javascript.
My blog does not need any readers. There are no ads, and everyone that needs to know about me knows about me.
I wrote this because I think the ideas are important to share -- abstraction is critical to having secure and maintainable code, and your language choice affects how you think about problems.
I did see the Javascript article here, of course.