Żeby mój projekt w ogóle wystartował potrzebuję przenieść użytkowników(a raczej ich hasła) z php-fusion7. Jest tam używany md5(md5()) tzw. podwójne szyfrowanie md5.
[code=ruby]module Devise
module Encryptors
class Md5 < Base
def self.digest(password, stretches, salt, pepper)
str = [password, salt].flatten.compact.join
Digest::MD5.hexdigest(str)
end
end
end
end
ja zrobiłem podobną rzecz, nie fusion ale stara werja strony w php, troche inaczej. wrzuciłem stare hasła uzytkowników do kolumny password_old i podczas logowania przez Devise najpierw próbowałem ich zalogowac po md5, jak poszło to kodowałem i zapisywałem jako devisowe password
Na pewno ma to związek. Na tym cały bajer solenia polega, że dwa takie same hasła potraktowane innym saltem będą różnymi hashami, bo gdyby salta nie było, to byłyby identyczne.
Musisz odtworzyć w Twoim encryptorze dokładnie taki sam sposób tworzenia haseł jak w PHP fusion, czyli:
usunąć solenie, jeśli w PHP Fusion go nie ma (lamerstwo i security vulnerability swoją drogą)
sprawdzić gdzie wywoływany jest Twój encryptor i przeładuj to wywołanie, żeby trafiała do niego odpowiednia liczba argumentów: znajdź Devise::Encryptors::Base.digest(password, stretches, salt, pepper) i zmień odpowiednio (wywal salt)
wywal salt listy argumentów i z ciała funkcji (ta linia “str = …”), bo po co to przekazywać, skoro tego nie używasz
[quote=krzyzak]str = [password].flatten.compact.join
zobacz co robią metody flatten, compact, join - bo lekko bez sensu jest ten kod ;)[/quote]
Ofkoz, myślałem, że to oczywiste jest
Ale nadal podtrzymuję, że nieposolone hasła to kiepski pomysł i lepiej byłoby je zmigrować na takie z soleniem i hashowane czymś lepszym, niż MD5…
Gdybym znalazł jakiś tutorial, z tym jak to zrobić tak jak napisał artur69, napewno bym się za to zabrał, narazie wystarczy bo to mały projekt dla 300 osób max.
Tutorial będzie ciężko znaleźć, trzeba by to rozpykać samemu. Na ten moment Tobie nie pomogę, ale jak starczy mi sił, to późnym wieczorem zrobię lekką rozkminę i może się coś urodzi.
Wrzucam kod, może się przyda a i może ktoś coś poprawi, testowane tylko na Devise 1.1.8, w nowszych wersjach mogło się coś zmienić w Devise::SessionsController, którego metode nadpisuje
def copy_old_password
if u = User.find_by_email(params[:user][:email])
if u.encrypted_password.blank? and u.password_old.present?
md5 = Digest::MD5.hexdigest(params[:user][:password] + ‘tu stary site miał jakis swój salt’)
sha1 = Digest::SHA1.hexdigest(md5)
if sha1 == u.password_old
u.update_attribute :password, params[:user][:password]
u
end
end
end
end