I want to upgrade password hashing from
Digest::SHA1.hexdigest(password + some_string + salt)
to SHA512.
Is there a way to migrate existing SHA1 password hashes to the same
security level as SHA512? What about this:
hashed_pw_sha512 = Digest::SHA512.hexdigest(hashed_pw_sha1 + other_salt)
And then authorize existing users as follows:
Digest::SHA512.hexdigest(Digest::SHA1.hexdigest(password + some_string +
salt) + other_salt) == hashed_pw_sha512
And as soon as users successfully login this way, then change hashing to
hashed_pw_sha512 = Digest::SHA512.hexdigest(password + other_salt)
and set the hashed_pw_sha1 attribute to nil in order to mark the user as
migrated.
Update: I’ve learned that bcrypt, PBKDF2, etc. should be used instead of
SHAxxx. So replacing SHA512 by bcrypt in my question:
I want to upgrade password hashing from
Digest::SHA1.hexdigest(password + some_string + salt)
to bcrypt.
Is there a way to migrate existing SHA1 password hashes to the same
security level as bcrypt? What about this:
hashed_pw_bcrypt = BCrypt::Password.create(hashed_pw_sha1)
And then authorize existing users as follows:
BCrypt::Password.create(Digest::SHA1.hexdigest(password + some_string +
salt)) == hashed_pw_bcrypt
And as soon as users successfully login this way, then change hashing to
hashed_pw_bcrypt = BCrypt::Password.create(password)
and set the hashed_pw_sha1 attribute to nil in order to mark the user as
migrated.
On Jun 7, 2015, at 6:10 AM, Luma [email protected] wrote:
BCrypt::Password.create(Digest::SHA1.hexdigest(password + some_string + salt))
== hashed_pw_bcrypt
And as soon as users successfully login this way, then change hashing to
hashed_pw_bcrypt = BCrypt::Password.create(password)
and set the hashed_pw_sha1 attribute to nil in order to mark the user as
migrated.
I think what I would do is add a new set of fields to the existing user
record for the new password types, and a boolean column to switch
between which one to use. Once all your users are migrated to the new
version, you can close off the old method. Something like this
pseudocode:
if the boolean is false, test given password against old hash
if it passes
re-hash the given password with the new algorithm
set the boolean
set the new hash column
save
redirect
if not
whatever you currently do
end
Walter
On Jun 7, 2015, at 10:13 AM, Luma [email protected] wrote:
What I think of is increasing the security level for all existing users before
they login the first time: immediately migrating all passwords to bcrypt(old
hash). The question is if this will really achieve the security level of bcrypt
for existing user accounts.
bcrypt(oldhash(password)) cannot be easier to crack than
oldhash(password), and will be harder except for degenerate cases where
oldhash(password) is easier to guess than password. (Imagine for
instance a “hash” function which just returned “password1” for all
inputs…)
–
Scott R.
[email protected]
http://www.elevated-dev.com/
https://www.linkedin.com/in/scottribe/
(303) 722-0567 voice
Yes, this is kind of a creeping migration, i.e. an user will be migrated
as
soon as he’s successfully being authenticated the first time.
What I think of is increasing the security level for all existing users
before they login the first time: immediately migrating all passwords to
bcrypt(old hash). The question is if this will really achieve the
security
level of bcrypt for existing user accounts.
br
Luma
Am Sonntag, 7. Juni 2015 17:42:15 UTC+2 schrieb Walter Lee D.: