forked from binarylogic/authlogic
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
36ad855
commit 0ac3088
Showing
3 changed files
with
65 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
require "digest/sha2" | ||
|
||
module Authlogic | ||
# The acts_as_authentic method has a crypto_provider option. This allows you to use any type of encryption you like. | ||
# Just create a class with a class level encrypt and matches? method. See example below. | ||
# | ||
# === Example | ||
# | ||
# class MyAwesomeEncryptionMethod | ||
# def self.encrypt(*tokens) | ||
# # the tokens passed will be an array of objects, what type of object is irrelevant, | ||
# # just do what you need to do with them and return a single encrypted string. | ||
# # for example, you will most likely join all of the objects into a single string and then encrypt that string | ||
# end | ||
# | ||
# def self.matches?(crypted, *tokens) | ||
# # return true if the crypted string matches the tokens. | ||
# # depending on your algorithm you might decrypt the string then compare it to the token, or you might | ||
# # encrypt the tokens and make sure it matches the crypted string, its up to you | ||
# end | ||
# end | ||
module CryptoProviders | ||
# = Sha256 | ||
# | ||
# Uses the Sha256 hash algorithm to encrypt passwords. | ||
class Sha256 | ||
class << self | ||
attr_accessor :join_token | ||
|
||
# The number of times to loop through the encryption. This is ten because that is what restful_authentication defaults to. | ||
def stretches | ||
@stretches ||= 20 | ||
end | ||
attr_writer :stretches | ||
|
||
# Turns your raw password into a Sha256 hash. | ||
def encrypt(*tokens) | ||
digest = tokens.flatten.join(join_token) | ||
stretches.times { digest = Digest::SHA256.hexdigest(digest) } | ||
digest | ||
end | ||
|
||
# Does the crypted password match the tokens? Uses the same tokens that were used to encrypt. | ||
def matches?(crypted, *tokens) | ||
encrypt(*tokens) == crypted | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
require File.dirname(__FILE__) + '/../test_helper.rb' | ||
|
||
module CryptoProviderTest | ||
class Sha256Test < ActiveSupport::TestCase | ||
def test_encrypt | ||
assert Authlogic::CryptoProviders::Sha256.encrypt("mypass") | ||
end | ||
|
||
def test_matches | ||
hash = Authlogic::CryptoProviders::Sha256.encrypt("mypass") | ||
assert Authlogic::CryptoProviders::Sha256.matches?(hash, "mypass") | ||
end | ||
end | ||
end |