passwordy 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: