passwordy 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ `stty -echo`
4
+
5
+ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
6
+
7
+ help = <<HELP
8
+ Passwordy generates passwords without a password database.
9
+
10
+ Basic Command Line Usage:
11
+ passwordy <domain> # Generate a password for a domain. Ex. www.google.com
12
+
13
+ HELP
14
+
15
+ require 'passwordy'
16
+ require 'passwordy/generator'
17
+
18
+ if ARGV.length != 1
19
+ puts 'Error: Please specify a domain for which to generate a password.'
20
+ exit(1)
21
+ end
22
+
23
+ puts Passwordy::Generator.generate_password(ARGV[1], $stdin.gets)
24
+
25
+ `stty echo`
@@ -0,0 +1 @@
1
+ require 'passwordy/generator'
@@ -0,0 +1,55 @@
1
+ require 'digest'
2
+ require 'securerandom'
3
+
4
+ module Passwordy
5
+ class Generator
6
+ # Public: Write a salt file to a particular location.
7
+ #
8
+ # path - The String path to save the salt.
9
+ #
10
+ # Does not overwrite an existing file at the given location.
11
+ def self.write_salt(path)
12
+ return if File.exists?(path)
13
+ File.open(path, 'w') do |f|
14
+ f.write(generate_salt)
15
+ f.chmod(0400)
16
+ end
17
+ end
18
+
19
+ # Public: Generate a password for a given resource.
20
+ #
21
+ # resource - The String name of the thing we want a
22
+ # password for.
23
+ # master_password - The String master password that is used to
24
+ # generate any subsequent passwords.
25
+ #
26
+ # Examples
27
+ #
28
+ # generate_password('google.com', 'keyboard cat')
29
+ # # => 'e94e5ce8c8ca9affb507ae9e152d4b44'
30
+ #
31
+ # Returns a password that can be used for the given resource.
32
+ def self.generate_password(resource, master_password)
33
+ salt_path = File.expand_path('~/.salt')
34
+ write_salt(salt_path)
35
+
36
+ salt = File.open(salt_path, 'r').read
37
+
38
+ first_digest = Digest::SHA512.hexdigest([salt, resource].join('\n'))
39
+ second_digest = Digest::SHA512.hexdigest(master_password)
40
+ digested_parts = [first_digest, second_digest].join('\n')
41
+
42
+ Digest::SHA512.hexdigest(digested_parts)[1..32]
43
+ end
44
+
45
+ private
46
+
47
+ def self.environment_info
48
+ ENV.map {|k,v| "#{k}=#{v}"}.join('&')
49
+ end
50
+
51
+ def self.generate_salt
52
+ Digest::SHA512.hexdigest(environment_info + SecureRandom.uuid)
53
+ end
54
+ end
55
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: passwordy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jon Roes
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &70159379454420 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '0.9'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70159379454420
25
+ - !ruby/object:Gem::Dependency
26
+ name: redgreen
27
+ requirement: &70159379453340 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '1.2'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70159379453340
36
+ - !ruby/object:Gem::Dependency
37
+ name: shoulda
38
+ requirement: &70159379452600 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '2.11'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70159379452600
47
+ - !ruby/object:Gem::Dependency
48
+ name: rr
49
+ requirement: &70159379451780 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70159379451780
58
+ description: Generates passwords for you without a password database.
59
+ email: jroes@jroes.net
60
+ executables:
61
+ - passwordy
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - lib/passwordy.rb
66
+ - lib/passwordy/generator.rb
67
+ - bin/passwordy
68
+ homepage: http://github.com/jroes/passwordy
69
+ licenses: []
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 1.8.11
89
+ signing_key:
90
+ specification_version: 3
91
+ summary: A password manager without a password manager.
92
+ test_files: []
93
+ has_rdoc: