Godwin
11 years ago
8 changed files with 1636979 additions and 12 deletions
File diff suppressed because one or more lines are too long
@ -0,0 +1,118 @@ |
|||
#require 'sorcery/lib/sorcery/crypto_providers/common' |
|||
#require 'ruby_drupal_hash' |
|||
|
|||
module Sorcery |
|||
module CryptoProviders |
|||
class DrupalPassword # < Sorcery::CryptoProviders::Common |
|||
include Common |
|||
class << self |
|||
#def join_token |
|||
# @join_token ||= "--" |
|||
#end |
|||
|
|||
# Turns your raw password into a Sha1 hash. |
|||
def encrypt(*tokens) |
|||
#puts tokens |
|||
#x |
|||
#tokens = tokens.flatten |
|||
#digest = tokens.shift |
|||
#stretches.times { digest = secure_digest([digest, *tokens].join(join_token)) } |
|||
#digest |
|||
hash(tokens.first()) |
|||
end |
|||
|
|||
#def secure_digest(digest) |
|||
# #Digest::SHA1.hexdigest(digest) |
|||
# hash(digest) |
|||
#end |
|||
|
|||
DRUPAL_MIN_HASH_COUNT = 7 |
|||
DRUPAL_MAX_HASH_COUNT = 30 |
|||
DRUPAL_HASH_LENGTH = 55 |
|||
ITOA64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' |
|||
|
|||
HASH = Digest::SHA2.new(512) |
|||
|
|||
def hash(password) |
|||
return false if password.nil? |
|||
|
|||
setting = '$S$DXHwLLD9k' |
|||
|
|||
count_log2 = ITOA64.index(setting[3]) |
|||
|
|||
if count_log2 < DRUPAL_MIN_HASH_COUNT or count_log2 > DRUPAL_MAX_HASH_COUNT |
|||
return false |
|||
end |
|||
|
|||
salt = setting[4..4+7] |
|||
|
|||
if salt.length != 8 |
|||
return false |
|||
end |
|||
|
|||
count = 2 ** count_log2 |
|||
|
|||
pass_hash = HASH.digest(salt + password) |
|||
|
|||
1.upto(count) do |i| |
|||
pass_hash = HASH.digest(pass_hash + password) |
|||
end |
|||
|
|||
hash_length = pass_hash.length |
|||
|
|||
output = setting + _password_base64_encode(pass_hash, hash_length) |
|||
|
|||
if output.length != 98 |
|||
return false |
|||
end |
|||
|
|||
return output[0..(DRUPAL_HASH_LENGTH - 1)] |
|||
end |
|||
|
|||
def _password_base64_encode(to_encode, count) |
|||
output = '' |
|||
i = 0 |
|||
while true |
|||
value = (to_encode[i]).ord |
|||
|
|||
i += 1 |
|||
|
|||
output = output + ITOA64[value & 0x3f] |
|||
if i < count |
|||
value |= (to_encode[i].ord) << 8 |
|||
end |
|||
|
|||
output = output + ITOA64[(value >> 6) & 0x3f] |
|||
|
|||
if i >= count |
|||
break |
|||
end |
|||
|
|||
i += 1 |
|||
|
|||
if i < count |
|||
value |= (to_encode[i].ord) << 16 |
|||
end |
|||
|
|||
output = output + ITOA64[(value >> 12) & 0x3f] |
|||
|
|||
if i >= count |
|||
break |
|||
end |
|||
|
|||
i += 1 |
|||
|
|||
output = output + ITOA64[(value >> 18) & 0x3f] |
|||
|
|||
if i >= count |
|||
break |
|||
end |
|||
|
|||
end |
|||
puts "\nHASH:\t#{output}\n" |
|||
return output |
|||
end |
|||
end |
|||
end |
|||
end |
|||
end |
Loading…
Reference in new issue