An old database used MySQL’s PASSWORD() hashing functionality for storing user credentials. We’re creating a Ruby app now to interface with that database, and wanted to hash the password in ruby. After looking at the code it looked like they just SHA1 hash the password twice and prepend a *. Implementation in Ruby is easy:
require 'digest/sha1' def hash_mysql_password pass "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest(pass)).upcase end
Which gives us in MySQL
mysql> SELECT PASSWORD('foo'); +-------------------------------------------+ | PASSWORD('foo') | +-------------------------------------------+ | *F3A2A51A9B0F2BE2468926B4132313728C250DBF | +-------------------------------------------+
And in Ruby
>> hash_mysql_password 'foo' => "*F3A2A51A9B0F2BE2468926B4132313728C250DBF"