1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- module PasswordHash
- include ApplicationLib
- class PasswordHash::Error < StandardError; end
- extend self
- def crypt(password)
-
- Argon2::Password.new(secret: secret).create(password)
- end
- def verified?(pw_hash, password)
- Argon2::Password.verify_password(password, pw_hash, secret)
- rescue
- false
- end
- def verified!(pw_hash, password)
- return if verified?(pw_hash, password)
- raise PasswordHash::Error, __('The password is invalid.')
- end
- def crypted?(pw_hash)
- return false if !pw_hash
- return true if hashed_argon2?(pw_hash)
- return true if hashed_sha2?(pw_hash)
- false
- end
- def legacy?(pw_hash, password)
- return false if pw_hash.blank?
- return false if !password
- return true if sha2?(pw_hash, password)
- return true if hashed_argon2i?(pw_hash, password)
- false
- end
- def hashed_sha2?(pw_hash)
- pw_hash.start_with?('{sha2}')
- end
- def hashed_argon2?(pw_hash)
- Argon2::Password.valid_hash?(pw_hash)
- end
- def hashed_argon2i?(pw_hash, password)
-
- return false if !pw_hash.match?(%r{^\$argon2i\$.{,112}})
-
- verified?(pw_hash, password)
- end
- def sha2(password)
- crypted = Digest::SHA2.hexdigest(password)
- "{sha2}#{crypted}"
- end
- private
- def sha2?(pw_hash, password)
- return false if !hashed_sha2?(pw_hash)
- pw_hash == sha2(password)
- end
- def secret
- @secret ||= Setting.get('application_secret')
- end
- end
|