Class: Authlogic::CryptoProviders::SCrypt

Inherits:
Object
  • Object
show all
Defined in:
lib/authlogic/crypto_providers/scrypt.rb

Overview

If you want a stronger hashing algorithm, but would prefer not to use BCrypt, SCrypt is another option. SCrypt is newer and less popular (and so less-tested), but it’s designed specifically to avoid a theoretical hardware attack against BCrypt. Just as with BCrypt, you are sacrificing performance relative to SHA2 algorithms, but the increased security may well be worth it. (That performance sacrifice is the exact reason it’s much, much harder for an attacker to brute-force your paswords). Decided SCrypt is for you? Just install the bcrypt gem:

gem install scrypt

Tell acts_as_authentic to use it:

acts_as_authentic do |c|
  c.crypto_provider = Authlogic::CryptoProviders::SCrypt
end

Constant Summary collapse

DEFAULTS =
{:key_len => 32, :salt_size => 8, :max_time => 0.2, :max_mem => 1024 * 1024, :max_memfrac => 0.5}

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.key_lenObject

Key length - length in bytes of generated key, from 16 to 512.



29
30
31
# File 'lib/authlogic/crypto_providers/scrypt.rb', line 29

def key_len
  @key_len ||= DEFAULTS[:key_len]
end

.max_memObject

Max memory - maximum memory usage. The minimum is always 1MB



44
45
46
# File 'lib/authlogic/crypto_providers/scrypt.rb', line 44

def max_mem
  @max_mem ||= DEFAULTS[:max_mem]
end

.max_memfracObject

Max memory fraction - maximum memory out of all available. Always greater than zero and <= 0.5.



49
50
51
# File 'lib/authlogic/crypto_providers/scrypt.rb', line 49

def max_memfrac
  @max_memfrac ||= DEFAULTS[:max_memfrac]
end

.max_timeObject

Max time - maximum time spent in computation



39
40
41
# File 'lib/authlogic/crypto_providers/scrypt.rb', line 39

def max_time
  @max_time ||= DEFAULTS[:max_time]
end

.salt_sizeObject

Salt size - size in bytes of random salt, from 8 to 32



34
35
36
# File 'lib/authlogic/crypto_providers/scrypt.rb', line 34

def salt_size
  @salt_size ||= DEFAULTS[:salt_size]
end

Class Method Details

.encrypt(*tokens) ⇒ Object

Creates an SCrypt hash for the password passed.



54
55
56
# File 'lib/authlogic/crypto_providers/scrypt.rb', line 54

def encrypt(*tokens)
  ::SCrypt::Password.create(join_tokens(tokens), :key_len => key_len, :salt_size => salt_size, :max_mem => max_mem, :max_memfrac => max_memfrac, :max_time => max_time)
end

.matches?(hash, *tokens) ⇒ Boolean

Does the hash match the tokens? Uses the same tokens that were used to encrypt.

Returns:

  • (Boolean)


59
60
61
62
63
# File 'lib/authlogic/crypto_providers/scrypt.rb', line 59

def matches?(hash, *tokens)
  hash = new_from_hash(hash)
  return false if hash.blank?
  hash == join_tokens(tokens)
end