Salt passwords so that two users with the same password will have
authorTom Hughes <tom@compton.nu>
Tue, 14 Aug 2007 23:25:58 +0000 (23:25 +0000)
committerTom Hughes <tom@compton.nu>
Tue, 14 Aug 2007 23:25:58 +0000 (23:25 +0000)
different password hashes in the database.

app/models/user.rb
lib/osm.rb

index bc0c9966ce35e28d34e16b6a764e23d64db40075..ec4c2f788bad93a37133d9815f3ea2136fd456b3 100644 (file)
@@ -1,6 +1,5 @@
 class User < ActiveRecord::Base
   require 'xml/libxml'
-  require 'digest/md5'
 
   has_many :traces
   has_many :diary_entries, :order => 'created_at DESC'
@@ -25,13 +24,16 @@ class User < ActiveRecord::Base
   end
 
   def encrypt_password
-    self.pass_crypt = Digest::MD5.hexdigest(pass_crypt) unless pass_crypt_confirmation.nil?
+    if pass_crypt_confirmation
+      self.pass_salt = OSM::make_token(8)
+      self.pass_crypt = OSM::encrypt_password(pass_crypt, pass_salt)
+    end
   end
 
   def self.authenticate(options)
     if options[:username] and options[:password]
       user = find(:first, :conditions => ["email = ? OR display_name = ?", options[:username], options[:username]])
-      user = nil unless user.pass_crypt == Digest::MD5.hexdigest(options[:password])
+      user = nil unless user.pass_crypt == OSM::encrypt_password(options[:password], user.pass_salt)
     elsif options[:token]
       token = UserToken.find(:first, :include => :user, :conditions => ["user_tokens.token = ?", options[:token]])
       user = token.user if token
index ea2a581645d797e7fd677cf31629863f569b2967..f458c5135ee849003d5cf66e349788cf8d4028c9 100644 (file)
@@ -12,6 +12,7 @@ module OSM
   require 'rexml/parsers/sax2parser'
   require 'rexml/text'
   require 'xml/libxml'
+  require 'digest/md5'
   require 'RMagick'
 
   class Mercator
@@ -403,4 +404,10 @@ module OSM
 
     return token
   end
+
+  # Return an encrypted version of a password
+  def self.encrypt_password(password, salt)
+    return Digest::MD5.hexdigest(password) if salt.nil?
+    return Digest::MD5.hexdigest(salt + password)
+  end
 end