views:

364

answers:

3

Is it considered good or bad practice to use MySQL's password function to hash passwords used by an application? I can see pros and cons. I'm curious if there is a general consensus on whether it is good or bad.

+5  A: 

If you are using a database function to hash passwords then by definition they have to arrive in the database unhashed: I would therefore prefer to do it much nearer the "source" i.e. in the frontend application so you're not passing around exposed information.

davek
+1 salting and hashing account passwords is an application issue, not something you'd want to rely on the DBMS's particular implementation for.
bobince
Word, this is not something you want to use. Just look at OLD_PASSWORD and the PITA that occurred when MySQL changed their hashing method. Much better to do it in the app, imo.
cookiecaper
+2  A: 

I believe the actual PASSWORD function in MySQL is insecure, and has been broken, but I can't find a link at the moment. I know the older one (OLD_PASSWORD in 5 and up) is definitely insecure.

Of course, all passwords should always be stored with a salt (for further obscurity). Example:

UPDATE users SET password=MD5(CONCAT('salt', 'user provided value')) WHERE id=54

There is also the MD5 function, but with the rise of colossal rainbow tables, it's not 100% reliable as a way of completely obfuscating stored passwords.

A better method is hashing the password (with a salt) before it reaches the database. Example:

<?php
$password = sha1(SALT.$_POST["password"]);
$sql = "UPDATE users SET password='".$password."' WHERE id=54";
?>
davethegr8
Looking at the code of password.c, MySQL 4.1+ password are encoded simply with SHA1 applied twice to the input (with no salt) and converted to a hex string.
Bill Karwin
+5  A: 

The docs for MySQL's PASSWORD() function states:

The PASSWORD() function is used by the authentication system in MySQL Server; you should not use it in your own applications.

Read "You're Probably Storing Passwords Incorrectly" for better advice on hashing and storing passwords.

MD5 and SHA-1 are considered to be too weak to use for passwords. The current recommendation is to use SHA-256.

I contributed a patch to MySQL to support a SHA2() function, and the patch was accepted, but since their roadmap has changed it's not clear when it will make it into a released product.

In the meantime, you can use hashing and salting in your programming language, and simply store the result hash digest in the database. If you use PHP, SHA-256 is available in the hash() function.

Bill Karwin