auto_hash 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.html +19 -34
- data/README.rdoc +16 -28
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/auto_hash.gemspec +5 -2
- data/created.rid +1 -1
- data/init.rb +1 -0
- data/lib/auto_hash.rb +6 -40
- data/test/common/user_test.rb +18 -20
- data/test/rails2x_root/db/development.sqlite3 +0 -0
- data/test/rails2x_root/db/migrate/20100803040436_create_users.rb +1 -1
- data/test/rails2x_root/db/schema.rb +1 -1
- data/test/rails2x_root/db/test.sqlite3 +0 -0
- data/test/rails2x_root/test/unit/user_test.rb +18 -20
- data/test/rails3x_root/Gemfile +3 -1
- data/test/rails3x_root/Gemfile.lock +5 -2
- data/test/rails3x_root/db/migrate/20100804020911_create_users.rb +1 -1
- data/test/rails3x_root/db/schema.rb +1 -1
- data/test/rails3x_root/test/unit/user_test.rb +18 -20
- metadata +19 -6
data/README.html
CHANGED
@@ -9,21 +9,27 @@
|
|
9
9
|
<h2>File: README.rdoc</h2>
|
10
10
|
<table>
|
11
11
|
<tr><td>Path:</td><td>README.rdoc</td></tr>
|
12
|
-
<tr><td>Modified:</td><td>Thu Aug
|
12
|
+
<tr><td>Modified:</td><td>Thu Aug 12 21:17:47 -0400 2010</td></tr>
|
13
13
|
</table>
|
14
14
|
|
15
15
|
<h1>auto_hash</h1>
|
16
16
|
<p>
|
17
|
-
A Ruby on Rails plugin to automate
|
18
|
-
|
17
|
+
A Ruby on Rails plugin to automate the cryptographic hashing of an
|
18
|
+
activerecord field.
|
19
|
+
</p>
|
20
|
+
<p>
|
21
|
+
UPDATE: auto_hash has quickly evolved to be a activerecord plugin that
|
22
|
+
merely wraps the excellent bcrypt-ruby library. <a
|
23
|
+
href="http://bcrypt-ruby.rubyforge.org">bcrypt-ruby.rubyforge.org</a>
|
19
24
|
</p>
|
20
25
|
<p>
|
21
26
|
Works with both rails 2x and 3x
|
22
27
|
</p>
|
23
28
|
<p>
|
24
|
-
WARNING: untested with ruby 1.9 at the moment.
|
29
|
+
WARNING: untested with ruby 1.9.2 at the moment. (Couldn‘t get rails
|
30
|
+
3x to work with ruby 1.9.2 - too early I guess)
|
25
31
|
</p>
|
26
|
-
<
|
32
|
+
<h3>Synopsis</h3>
|
27
33
|
<pre>
|
28
34
|
# In Model
|
29
35
|
class User < ActiveRecord::Base
|
@@ -31,19 +37,16 @@ WARNING: untested with ruby 1.9 at the moment.
|
|
31
37
|
end
|
32
38
|
|
33
39
|
# Elsewhere
|
34
|
-
user = User.
|
35
|
-
user.password #=> "
|
36
|
-
user.
|
40
|
+
user = User.create(:email => "kevin@example.com", :password => "asdf")
|
41
|
+
user.password #=> "$2a$10$0DvrQ.HMKRySMJrn0cGEM.AcesF82tkeBfNLTZTZ.VSWePihZD3mG"
|
42
|
+
user.password == "asdf" # => true
|
37
43
|
|
38
44
|
# works with updating fields also
|
39
|
-
user = User.
|
45
|
+
user = User.find_by_email("kevin@example.com")
|
40
46
|
user.password = "better_password"
|
41
|
-
user.
|
42
|
-
</pre>
|
43
|
-
<h2>Installing</h2>
|
44
|
-
<pre>
|
45
|
-
sudo gem install auto_hash
|
47
|
+
user.password == "better_password" # => true
|
46
48
|
</pre>
|
49
|
+
<h3>Rails configuration (nothing unusual)</h3>
|
47
50
|
<p>
|
48
51
|
For rails 2x, in environment.rb
|
49
52
|
</p>
|
@@ -58,25 +61,7 @@ For rails 3x, in Gemfile
|
|
58
61
|
<pre>
|
59
62
|
gem "auto_hash"
|
60
63
|
</pre>
|
61
|
-
<
|
62
|
-
<p>
|
63
|
-
The hashing is pretty simple, you‘ll find something like this in the
|
64
|
-
source:
|
65
|
-
</p>
|
66
|
-
<pre>
|
67
|
-
salt = ActiveSupport::SecureRandom.hex(10)
|
68
|
-
hash = Digest::SHA2.new.update(value + salt).to_s
|
69
|
-
</pre>
|
70
|
-
<p>
|
71
|
-
The value stored in the database field is a hash appended with its salt, as
|
72
|
-
"hash-salt"
|
73
|
-
</p>
|
74
|
-
<p>
|
75
|
-
In case you weren‘t sure, a salt is not necessarily a secret - its
|
76
|
-
simply a way to defeat dictionary attacks by adding huge variety to the
|
77
|
-
hashed value.
|
78
|
-
</p>
|
79
|
-
<h2>Copyright</h2>
|
64
|
+
<h3>Copyright</h3>
|
80
65
|
<p>
|
81
66
|
Copyright (c) 2010 Kevin Swope. See LICENSE for details.
|
82
67
|
</p>
|
@@ -94,4 +79,4 @@ Files: 1
|
|
94
79
|
Classes: 0
|
95
80
|
Modules: 0
|
96
81
|
Methods: 0
|
97
|
-
Elapsed: 0.
|
82
|
+
Elapsed: 0.044s
|
data/README.rdoc
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
= auto_hash
|
2
2
|
|
3
|
-
A Ruby on Rails plugin to automate
|
4
|
-
|
3
|
+
A Ruby on Rails plugin to automate the cryptographic hashing of an
|
4
|
+
activerecord field.
|
5
|
+
|
6
|
+
UPDATE: auto_hash has quickly evolved to be a activerecord plugin that
|
7
|
+
merely wraps the excellent bcrypt-ruby
|
8
|
+
library. http://bcrypt-ruby.rubyforge.org
|
5
9
|
|
6
10
|
Works with both rails 2x and 3x
|
7
11
|
|
8
|
-
WARNING: untested with ruby 1.9 at the moment.
|
12
|
+
WARNING: untested with ruby 1.9.2 at the moment. (Couldn't get rails
|
13
|
+
3x to work with ruby 1.9.2 - too early I guess)
|
9
14
|
|
10
|
-
|
15
|
+
=== Synopsis
|
11
16
|
|
12
17
|
# In Model
|
13
18
|
class User < ActiveRecord::Base
|
@@ -15,18 +20,16 @@ WARNING: untested with ruby 1.9 at the moment.
|
|
15
20
|
end
|
16
21
|
|
17
22
|
# Elsewhere
|
18
|
-
user = User.
|
19
|
-
user.password #=> "
|
20
|
-
user.
|
23
|
+
user = User.create(:email => "kevin@example.com", :password => "asdf")
|
24
|
+
user.password #=> "$2a$10$0DvrQ.HMKRySMJrn0cGEM.AcesF82tkeBfNLTZTZ.VSWePihZD3mG"
|
25
|
+
user.password == "asdf" # => true
|
21
26
|
|
22
27
|
# works with updating fields also
|
23
|
-
user = User.
|
28
|
+
user = User.find_by_email("kevin@example.com")
|
24
29
|
user.password = "better_password"
|
25
|
-
user.
|
26
|
-
|
27
|
-
== Installing
|
30
|
+
user.password == "better_password" # => true
|
28
31
|
|
29
|
-
|
32
|
+
=== Rails configuration (nothing unusual)
|
30
33
|
|
31
34
|
For rails 2x, in environment.rb
|
32
35
|
Rails::Initializer.run do |config| do
|
@@ -36,21 +39,6 @@ For rails 2x, in environment.rb
|
|
36
39
|
For rails 3x, in Gemfile
|
37
40
|
gem "auto_hash"
|
38
41
|
|
39
|
-
|
40
|
-
== Details
|
41
|
-
|
42
|
-
The hashing is pretty simple, you'll find something like this in the source:
|
43
|
-
|
44
|
-
salt = ActiveSupport::SecureRandom.hex(10)
|
45
|
-
hash = Digest::SHA2.new.update(value + salt).to_s
|
46
|
-
|
47
|
-
The value stored in the database field is a hash appended with its salt, as
|
48
|
-
"hash-salt"
|
49
|
-
|
50
|
-
In case you weren't sure, a salt is not necessarily a secret - its
|
51
|
-
simply a way to defeat dictionary attacks by adding huge variety to
|
52
|
-
the hashed value.
|
53
|
-
|
54
|
-
== Copyright
|
42
|
+
=== Copyright
|
55
43
|
|
56
44
|
Copyright (c) 2010 Kevin Swope. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -12,6 +12,7 @@ begin
|
|
12
12
|
gem.email = "gems-kevdev@snkmail.com"
|
13
13
|
gem.homepage = "http://github.com/kswope/auto_hash"
|
14
14
|
gem.authors = ["Kevin Swope"]
|
15
|
+
gem.add_dependency('bcrypt-ruby')
|
15
16
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
17
|
end
|
17
18
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/auto_hash.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{auto_hash}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kevin Swope"]
|
12
|
-
s.date = %q{2010-08-
|
12
|
+
s.date = %q{2010-08-14}
|
13
13
|
s.description = %q{Ruby on Rails plugin to automate hashing an activerecord field and saving as a salt and digest in a single field.}
|
14
14
|
s.email = %q{gems-kevdev@snkmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -147,9 +147,12 @@ Gem::Specification.new do |s|
|
|
147
147
|
s.specification_version = 3
|
148
148
|
|
149
149
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
150
|
+
s.add_runtime_dependency(%q<bcrypt-ruby>, [">= 0"])
|
150
151
|
else
|
152
|
+
s.add_dependency(%q<bcrypt-ruby>, [">= 0"])
|
151
153
|
end
|
152
154
|
else
|
155
|
+
s.add_dependency(%q<bcrypt-ruby>, [">= 0"])
|
153
156
|
end
|
154
157
|
end
|
155
158
|
|
data/created.rid
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Thu,
|
1
|
+
Thu, 12 Aug 2010 21:17:48 -0400
|
data/init.rb
CHANGED
data/lib/auto_hash.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
|
2
|
+
require 'bcrypt'
|
3
|
+
|
2
4
|
module AutoHash
|
3
5
|
|
4
6
|
def self.included(base)
|
@@ -16,7 +18,7 @@ module AutoHash
|
|
16
18
|
# Dynamically define a new setter
|
17
19
|
define_method "#{field_name}=" do |value|
|
18
20
|
|
19
|
-
value =
|
21
|
+
value = BCrypt::Password.create(value)
|
20
22
|
|
21
23
|
# write_attribute() is the documented way to write to a AR
|
22
24
|
# field after you've overridden the setter,
|
@@ -26,49 +28,13 @@ module AutoHash
|
|
26
28
|
end
|
27
29
|
|
28
30
|
# Dynamically define the "comparer"
|
29
|
-
define_method "#{field_name}
|
30
|
-
existing = send(field_name)
|
31
|
-
value = AutoHashBuilder.auto_hash_compare(existing, match.to_s)
|
32
|
-
end
|
31
|
+
define_method "#{field_name}" do
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
# This nested class is here only to avoid exposing the autohash
|
39
|
-
# inner api to the AR model. It has no other excuse to be a class.
|
40
|
-
class AutoHashBuilder
|
41
|
-
|
42
|
-
class << self
|
43
|
-
|
44
|
-
def auto_hash_create(value)
|
45
|
-
salt = ActiveSupport::SecureRandom.hex(10)
|
46
|
-
hash = create_hash(value, salt)
|
47
|
-
"#{hash}-#{salt}"
|
48
|
-
end
|
33
|
+
BCrypt::Password.new(read_attribute(field_name))
|
49
34
|
|
50
|
-
def auto_hash_compare(hash, value)
|
51
|
-
salt = extract_salt_part(hash)
|
52
|
-
hash_old = extract_hash_part(hash)
|
53
|
-
hash_new = create_hash(value, salt) # try to recreate same hash
|
54
|
-
hash_new == hash_old
|
55
35
|
end
|
56
36
|
|
57
|
-
|
58
|
-
|
59
|
-
def create_hash(value, salt)
|
60
|
-
Digest::SHA2.new.update(value + salt).to_s
|
61
|
-
end
|
62
|
-
|
63
|
-
def extract_hash_part(hash)
|
64
|
-
hash.split(/-/)[0]
|
65
|
-
end
|
66
|
-
|
67
|
-
def extract_salt_part(hash)
|
68
|
-
hash.split(/-/)[1]
|
69
|
-
end
|
70
|
-
|
71
|
-
end # << class << self
|
37
|
+
end
|
72
38
|
|
73
39
|
end
|
74
40
|
|
data/test/common/user_test.rb
CHANGED
@@ -6,21 +6,17 @@ class UserTest < ActiveSupport::TestCase
|
|
6
6
|
|
7
7
|
test "simple instantiation" do
|
8
8
|
|
9
|
-
@user = User.new(:
|
9
|
+
@user = User.new(:email => "me@example.com", :password => "asdf")
|
10
10
|
assert @user
|
11
11
|
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
# password until running the comparer method, but we can check if
|
16
|
-
# its nil or blank, or its not still the clear text password - which
|
17
|
-
# would be quite a bug.
|
18
|
-
test "password hashed" do
|
14
|
+
test "password touched" do
|
19
15
|
|
20
16
|
original_password = "asdf"
|
21
|
-
@user = User.new(:
|
17
|
+
@user = User.new(:email => "me@example.com", :password => original_password)
|
22
18
|
|
23
|
-
assert_equal "
|
19
|
+
assert_equal "me@example.com", @user.email # make sure other fields untouched
|
24
20
|
assert_not_equal nil, @user.password
|
25
21
|
assert_not_equal "", @user.password
|
26
22
|
assert_not_equal original_password, @user.password
|
@@ -31,12 +27,13 @@ class UserTest < ActiveSupport::TestCase
|
|
31
27
|
test "matching" do
|
32
28
|
|
33
29
|
original_password = "asdf"
|
34
|
-
@user = User.new(:username => "kevin", :password => original_password)
|
35
30
|
|
36
|
-
|
37
|
-
|
38
|
-
assert
|
39
|
-
assert ! @user.
|
31
|
+
@user = User.new(:email => "me@example.com", :password => original_password)
|
32
|
+
|
33
|
+
assert @user.password == original_password
|
34
|
+
assert ! (@user.password == "banana")
|
35
|
+
assert ! (@user.password == "")
|
36
|
+
assert ! (@user.password == nil)
|
40
37
|
|
41
38
|
end
|
42
39
|
|
@@ -44,15 +41,16 @@ class UserTest < ActiveSupport::TestCase
|
|
44
41
|
test "write, find, match" do
|
45
42
|
|
46
43
|
original_password = "asdf"
|
47
|
-
@user = User.new(:username => "kevin", :password => original_password)
|
48
|
-
@user.save
|
49
44
|
|
50
|
-
user = User.
|
45
|
+
@user = User.create(:email => "me@example.com",
|
46
|
+
:password => original_password)
|
47
|
+
|
48
|
+
user = User.find_by_email("me@example.com")
|
51
49
|
|
52
|
-
assert user.
|
53
|
-
assert ! user.
|
54
|
-
assert ! user.
|
55
|
-
assert ! user.
|
50
|
+
assert user.password == original_password
|
51
|
+
assert ! (user.password == "banana")
|
52
|
+
assert ! (user.password == "")
|
53
|
+
assert ! (user.password == nil)
|
56
54
|
|
57
55
|
end
|
58
56
|
|
Binary file
|
Binary file
|
@@ -6,21 +6,17 @@ class UserTest < ActiveSupport::TestCase
|
|
6
6
|
|
7
7
|
test "simple instantiation" do
|
8
8
|
|
9
|
-
@user = User.new(:
|
9
|
+
@user = User.new(:email => "me@example.com", :password => "asdf")
|
10
10
|
assert @user
|
11
11
|
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
# password until running the comparer method, but we can check if
|
16
|
-
# its nil or blank, or its not still the clear text password - which
|
17
|
-
# would be quite a bug.
|
18
|
-
test "password hashed" do
|
14
|
+
test "password touched" do
|
19
15
|
|
20
16
|
original_password = "asdf"
|
21
|
-
@user = User.new(:
|
17
|
+
@user = User.new(:email => "me@example.com", :password => original_password)
|
22
18
|
|
23
|
-
assert_equal "
|
19
|
+
assert_equal "me@example.com", @user.email # make sure other fields untouched
|
24
20
|
assert_not_equal nil, @user.password
|
25
21
|
assert_not_equal "", @user.password
|
26
22
|
assert_not_equal original_password, @user.password
|
@@ -31,12 +27,13 @@ class UserTest < ActiveSupport::TestCase
|
|
31
27
|
test "matching" do
|
32
28
|
|
33
29
|
original_password = "asdf"
|
34
|
-
@user = User.new(:username => "kevin", :password => original_password)
|
35
30
|
|
36
|
-
|
37
|
-
|
38
|
-
assert
|
39
|
-
assert ! @user.
|
31
|
+
@user = User.new(:email => "me@example.com", :password => original_password)
|
32
|
+
|
33
|
+
assert @user.password == original_password
|
34
|
+
assert ! (@user.password == "banana")
|
35
|
+
assert ! (@user.password == "")
|
36
|
+
assert ! (@user.password == nil)
|
40
37
|
|
41
38
|
end
|
42
39
|
|
@@ -44,15 +41,16 @@ class UserTest < ActiveSupport::TestCase
|
|
44
41
|
test "write, find, match" do
|
45
42
|
|
46
43
|
original_password = "asdf"
|
47
|
-
@user = User.new(:username => "kevin", :password => original_password)
|
48
|
-
@user.save
|
49
44
|
|
50
|
-
user = User.
|
45
|
+
@user = User.create(:email => "me@example.com",
|
46
|
+
:password => original_password)
|
47
|
+
|
48
|
+
user = User.find_by_email("me@example.com")
|
51
49
|
|
52
|
-
assert user.
|
53
|
-
assert ! user.
|
54
|
-
assert ! user.
|
55
|
-
assert ! user.
|
50
|
+
assert user.password == original_password
|
51
|
+
assert ! (user.password == "banana")
|
52
|
+
assert ! (user.password == "")
|
53
|
+
assert ! (user.password == nil)
|
56
54
|
|
57
55
|
end
|
58
56
|
|
data/test/rails3x_root/Gemfile
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/kevin/Development/auto_hash
|
3
3
|
specs:
|
4
|
-
auto_hash (0.
|
4
|
+
auto_hash (0.2.0)
|
5
|
+
bcrypt-ruby
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: http://rubygems.org/
|
@@ -35,6 +36,7 @@ GEM
|
|
35
36
|
activesupport (3.0.0.rc)
|
36
37
|
arel (0.4.0)
|
37
38
|
activesupport (>= 3.0.0.beta)
|
39
|
+
bcrypt-ruby (2.1.2)
|
38
40
|
builder (2.1.2)
|
39
41
|
erubis (2.6.6)
|
40
42
|
abstract (>= 1.0.0)
|
@@ -65,7 +67,7 @@ GEM
|
|
65
67
|
thor (~> 0.14.0)
|
66
68
|
rake (0.8.7)
|
67
69
|
redgreen (1.2.2)
|
68
|
-
sqlite3-ruby (1.3.
|
70
|
+
sqlite3-ruby (1.3.1)
|
69
71
|
thor (0.14.0)
|
70
72
|
treetop (1.4.8)
|
71
73
|
polyglot (>= 0.3.1)
|
@@ -76,6 +78,7 @@ PLATFORMS
|
|
76
78
|
|
77
79
|
DEPENDENCIES
|
78
80
|
auto_hash!
|
81
|
+
bcrypt-ruby
|
79
82
|
rails (= 3.0.0.rc)
|
80
83
|
redgreen
|
81
84
|
sqlite3-ruby
|
@@ -6,21 +6,17 @@ class UserTest < ActiveSupport::TestCase
|
|
6
6
|
|
7
7
|
test "simple instantiation" do
|
8
8
|
|
9
|
-
@user = User.new(:
|
9
|
+
@user = User.new(:email => "me@example.com", :password => "asdf")
|
10
10
|
assert @user
|
11
11
|
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
# password until running the comparer method, but we can check if
|
16
|
-
# its nil or blank, or its not still the clear text password - which
|
17
|
-
# would be quite a bug.
|
18
|
-
test "password hashed" do
|
14
|
+
test "password touched" do
|
19
15
|
|
20
16
|
original_password = "asdf"
|
21
|
-
@user = User.new(:
|
17
|
+
@user = User.new(:email => "me@example.com", :password => original_password)
|
22
18
|
|
23
|
-
assert_equal "
|
19
|
+
assert_equal "me@example.com", @user.email # make sure other fields untouched
|
24
20
|
assert_not_equal nil, @user.password
|
25
21
|
assert_not_equal "", @user.password
|
26
22
|
assert_not_equal original_password, @user.password
|
@@ -31,12 +27,13 @@ class UserTest < ActiveSupport::TestCase
|
|
31
27
|
test "matching" do
|
32
28
|
|
33
29
|
original_password = "asdf"
|
34
|
-
@user = User.new(:username => "kevin", :password => original_password)
|
35
30
|
|
36
|
-
|
37
|
-
|
38
|
-
assert
|
39
|
-
assert ! @user.
|
31
|
+
@user = User.new(:email => "me@example.com", :password => original_password)
|
32
|
+
|
33
|
+
assert @user.password == original_password
|
34
|
+
assert ! (@user.password == "banana")
|
35
|
+
assert ! (@user.password == "")
|
36
|
+
assert ! (@user.password == nil)
|
40
37
|
|
41
38
|
end
|
42
39
|
|
@@ -44,15 +41,16 @@ class UserTest < ActiveSupport::TestCase
|
|
44
41
|
test "write, find, match" do
|
45
42
|
|
46
43
|
original_password = "asdf"
|
47
|
-
@user = User.new(:username => "kevin", :password => original_password)
|
48
|
-
@user.save
|
49
44
|
|
50
|
-
user = User.
|
45
|
+
@user = User.create(:email => "me@example.com",
|
46
|
+
:password => original_password)
|
47
|
+
|
48
|
+
user = User.find_by_email("me@example.com")
|
51
49
|
|
52
|
-
assert user.
|
53
|
-
assert ! user.
|
54
|
-
assert ! user.
|
55
|
-
assert ! user.
|
50
|
+
assert user.password == original_password
|
51
|
+
assert ! (user.password == "banana")
|
52
|
+
assert ! (user.password == "")
|
53
|
+
assert ! (user.password == nil)
|
56
54
|
|
57
55
|
end
|
58
56
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: auto_hash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kevin Swope
|
@@ -15,10 +15,23 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-14 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: bcrypt-ruby
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
22
35
|
description: Ruby on Rails plugin to automate hashing an activerecord field and saving as a salt and digest in a single field.
|
23
36
|
email: gems-kevdev@snkmail.com
|
24
37
|
executables: []
|