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.
- data/bin/passwordy +25 -0
- data/lib/passwordy.rb +1 -0
- data/lib/passwordy/generator.rb +55 -0
- metadata +93 -0
data/bin/passwordy
ADDED
@@ -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`
|
data/lib/passwordy.rb
ADDED
@@ -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:
|