Skip to content

Instantly share code, notes, and snippets.

@pkarman
Created September 30, 2016 20:51
Show Gist options
  • Select an option

  • Save pkarman/d7239bd00b49645b9f5ff5200fdb78c2 to your computer and use it in GitHub Desktop.

Select an option

Save pkarman/d7239bd00b49645b9f5ff5200fdb78c2 to your computer and use it in GitHub Desktop.
build ssn rainbow table with dbm
require 'digest'
require 'openssl'
require 'base64'
require 'dbm'
# usage: ruby build-ssn-db.rb dbname path/to/key keypassphrase [range_start] [range_end]
# range_start and _end should be 1 .. 999
#
# example: ruby build-ssn-db.rb ssn-01-10 path/to/key pw 1 10
def db
@_db ||= DBM.open(@db_name, 0600, DBM::WRCREAT)
end
def encode(text)
Base64.strict_encode64(text)
end
def sign(text)
encode(@private_key.sign(@digest, encode(text)))
end
def build_ssn_rainbow_table(range_start=1, range_end=999)
(range_start..range_end).each do |area_number|
puts "#{area_number}"
(1..99).each do |group_number|
(1..9999).each do |serial_number|
ssn = sprintf("%03d-%02d-%04d", area_number, group_number, serial_number)
signature = Digest::SHA256.hexdigest(sign(ssn))
db[signature] = ssn
end
end
end
end
@digest = OpenSSL::Digest::SHA256.new
@db_name = ARGV.shift
@private_key = OpenSSL::PKey::RSA.new(File.read(ARGV.shift), ARGV.shift)
build_ssn_rainbow_table(*ARGV)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment