Valid hashed passwords

Hey all - just wanted to check if I'm going about this in the right way...

I have class User, user has a password

Password should only be valid if it's between 6 and 16 chars in length.

New user is created if everything is valid and it's stored to the db.

After saving to the database, the password is then hashed making it over 16 chars in length.

The User record no longer passes validation.

In the past I've just figured this wasn't an issue; just make sure the object is valid before saving it to the db.

However, if using validates_associated on any of a Users children, the child object becomes invalid becuase the user is no longer passing validation

In the past I've just dropped the validates_associated as it wasn't stricly neccessary. - I'd just make sure I always called User.children.create

Is there a better way to handle this?

Gavin Morrice wrote:

Hey all - just wanted to check if I'm going about this in the right way...

I have class User, user has a password

Password should only be valid if it's between 6 and 16 chars in length.

Fist of all, don't limit the length of a user's password. At least not down to 16 chars. All you're doing is limiting the level of security the use can have. If they want 20 or even 30 or 40 character passwords, so what. I use long random passwords all the time in combination with a password manager.

New user is created if everything is valid and it's stored to the db.

After saving to the database, the password is then hashed making it over 16 chars in length.

SHA1, or whatever message digest (hash), algorithm is always going to be the same length no matter how long, or short, the cleartext password is so there's no reason to put any limitations on the cleartext password.

The User record no longer passes validation.

Don't hack off the end of your message digest and this wont happen.

In the past I've just figured this wasn't an issue; just make sure the object is valid before saving it to the db.

You figured wrong. :slight_smile:

However, if using validates_associated on any of a Users children, the child object becomes invalid becuase the user is no longer passing validation

In the past I've just dropped the validates_associated as it wasn't stricly neccessary. - I'd just make sure I always called User.children.create

Is there a better way to handle this?

In a word yes. See above.

Don't store the plain text and the hashed password in the same column. Create the methods for the plain text password in your model and store the hashed (and salted and stretched I hope) value in the database. Then fix your validation, since the model should be checking the password before hashing, not as part of the validation.

Gottit - thank you both for clearing that up