bcrypt-ruby 2.1.4-java → 3.0.0-java

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,34 @@
1
+ require 'ffi'
2
+
3
+ module BCrypt
4
+ class Engine
5
+ extend FFI::Library
6
+
7
+ BCRYPT_MAXSALT = 16
8
+ BCRYPT_SALT_OUTPUT_SIZE = 7 + (BCRYPT_MAXSALT * 4 + 2) / 3 + 1
9
+ BCRYPT_OUTPUT_SIZE = 128
10
+
11
+ ffi_lib File.expand_path("../bcrypt_ext", __FILE__)
12
+
13
+ attach_function :ruby_bcrypt, [:buffer_out, :string, :string], :string
14
+ attach_function :ruby_bcrypt_gensalt, [:buffer_out, :uint8, :pointer], :string
15
+
16
+ def self.__bc_salt(cost, seed)
17
+ buffer_out = FFI::Buffer.alloc_out(BCRYPT_SALT_OUTPUT_SIZE, 1)
18
+ seed_ptr = FFI::MemoryPointer.new(:uint8, BCRYPT_MAXSALT)
19
+ seed.bytes.to_a.each_with_index { |b, i| seed_ptr.int8_put(i, b) }
20
+ out = ruby_bcrypt_gensalt(buffer_out, cost, seed_ptr)
21
+ seed_ptr.free
22
+ buffer_out.free
23
+ out || ""
24
+ end
25
+
26
+ def self.__bc_crypt(key, salt, cost)
27
+ buffer_out = FFI::Buffer.alloc_out(BCRYPT_OUTPUT_SIZE, 1)
28
+ out = ruby_bcrypt(buffer_out, key || "", salt)
29
+ buffer_out.free
30
+ out && out.any? ? out : nil
31
+ end
32
+ end
33
+ end
34
+
data/lib/bcrypt_ext.jar CHANGED
Binary file
@@ -30,9 +30,9 @@ end
30
30
  describe "Autodetecting of salt cost" do
31
31
 
32
32
  specify "should work" do
33
- BCrypt::Engine.autodetect_cost("$2a$08$hRx2IVeHNsTSYYtUWn61Ou").should == 8
34
- BCrypt::Engine.autodetect_cost("$2a$05$XKd1bMnLgUnc87qvbAaCUu").should == 5
35
- BCrypt::Engine.autodetect_cost("$2a$13$Lni.CZ6z5A7344POTFBBV.").should == 13
33
+ BCrypt::Engine.autodetect_cost("$2a$08$hRx2IVeHNsTSYYtUWn61Ou").should eq 8
34
+ BCrypt::Engine.autodetect_cost("$2a$05$XKd1bMnLgUnc87qvbAaCUu").should eq 5
35
+ BCrypt::Engine.autodetect_cost("$2a$13$Lni.CZ6z5A7344POTFBBV.").should eq 13
36
36
  end
37
37
 
38
38
  end
@@ -39,9 +39,9 @@ describe "Reading a hashed password" do
39
39
  password.version.should eql("2a")
40
40
  password.cost.should equal(5)
41
41
  password.salt.should eql("$2a$05$CCCCCCCCCCCCCCCCCCCCC.")
42
- password.salt.class.should == String
42
+ password.salt.class.should eq String
43
43
  password.checksum.should eq("E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW")
44
- password.checksum.class.should == String
44
+ password.checksum.class.should eq String
45
45
  password.to_s.should eql(@hash)
46
46
  end
47
47
 
@@ -65,3 +65,12 @@ describe "Comparing a hashed password with a secret" do
65
65
  (@password == "@secret").should be(false)
66
66
  end
67
67
  end
68
+
69
+ describe "Validating a generated salt" do
70
+ specify "should not accept an invalid salt" do
71
+ BCrypt::Engine.valid_salt?("invalid").should eq(false)
72
+ end
73
+ specify "should accept a valid salt" do
74
+ BCrypt::Engine.valid_salt?(BCrypt::Engine.generate_salt).should eq(true)
75
+ end
76
+ end
metadata CHANGED
@@ -1,111 +1,123 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bcrypt-ruby
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 7
5
+ prerelease:
5
6
  segments:
6
- - 2
7
- - 1
8
- - 4
9
- version: 2.1.4
7
+ - 3
8
+ - 0
9
+ - 0
10
+ version: 3.0.0
10
11
  platform: java
11
12
  authors:
12
- - Coda Hale
13
+ - Coda Hale
13
14
  autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2011-01-08 00:00:00 -08:00
18
- default_executable:
18
+ date: 2011-08-24 00:00:00 Z
19
19
  dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: rake-compiler
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- version: "0"
30
- type: :development
31
- version_requirements: *id001
32
- - !ruby/object:Gem::Dependency
33
- name: rspec
34
- prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- segments:
40
- - 0
41
- version: "0"
42
- type: :development
43
- version_requirements: *id002
20
+ - !ruby/object:Gem::Dependency
21
+ name: rake-compiler
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rspec
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :development
47
+ version_requirements: *id002
44
48
  description: " bcrypt() is a sophisticated and secure hash algorithm designed by The OpenBSD project\n for hashing passwords. bcrypt-ruby provides a simple, humane wrapper for safely handling\n passwords.\n"
45
49
  email: coda.hale@gmail.com
46
50
  executables: []
47
51
 
48
- extensions: []
49
-
52
+ extensions:
53
+ - ext/mri/extconf.rb
50
54
  extra_rdoc_files:
51
- - README
52
- - COPYING
53
- - CHANGELOG
54
- - lib/bcrypt.rb
55
+ - README.md
56
+ - COPYING
57
+ - CHANGELOG
58
+ - lib/bcrypt.rb
59
+ - lib/bcrypt_engine.rb
55
60
  files:
56
- - .gitignore
57
- - .rspec
58
- - CHANGELOG
59
- - COPYING
60
- - Gemfile
61
- - README
62
- - Rakefile
63
- - bcrypt-ruby.gemspec
64
- - ext/jruby/bcrypt_jruby/BCrypt.java
65
- - ext/mri/bcrypt.c
66
- - ext/mri/bcrypt.h
67
- - ext/mri/bcrypt_ext.c
68
- - ext/mri/blf.h
69
- - ext/mri/blowfish.c
70
- - ext/mri/extconf.rb
71
- - lib/bcrypt.rb
72
- - spec/TestBCrypt.java
73
- - spec/bcrypt/engine_spec.rb
74
- - spec/bcrypt/password_spec.rb
75
- - spec/spec_helper.rb
76
- - lib/bcrypt_ext.jar
77
- has_rdoc: true
61
+ - .gitignore
62
+ - .rspec
63
+ - CHANGELOG
64
+ - COPYING
65
+ - Gemfile
66
+ - Gemfile.lock
67
+ - README.md
68
+ - Rakefile
69
+ - bcrypt-ruby.gemspec
70
+ - ext/jruby/bcrypt_jruby/BCrypt.java
71
+ - ext/mri/bcrypt_ext.c
72
+ - ext/mri/crypt.c
73
+ - ext/mri/crypt.h
74
+ - ext/mri/crypt_blowfish.c
75
+ - ext/mri/crypt_gensalt.c
76
+ - ext/mri/extconf.rb
77
+ - ext/mri/ow-crypt.h
78
+ - ext/mri/wrapper.c
79
+ - lib/bcrypt.rb
80
+ - lib/bcrypt_engine.rb
81
+ - spec/TestBCrypt.java
82
+ - spec/bcrypt/engine_spec.rb
83
+ - spec/bcrypt/password_spec.rb
84
+ - spec/spec_helper.rb
85
+ - lib/bcrypt_ext.jar
78
86
  homepage: http://bcrypt-ruby.rubyforge.org
79
87
  licenses: []
80
88
 
81
89
  post_install_message:
82
90
  rdoc_options:
83
- - --title
84
- - bcrypt-ruby
85
- - --line-numbers
86
- - --inline-source
87
- - --main
88
- - README
91
+ - --title
92
+ - bcrypt-ruby
93
+ - --line-numbers
94
+ - --inline-source
95
+ - --main
96
+ - README.md
89
97
  require_paths:
90
- - lib
98
+ - lib
91
99
  required_ruby_version: !ruby/object:Gem::Requirement
100
+ none: false
92
101
  requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- segments:
96
- - 0
97
- version: "0"
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ hash: 3
105
+ segments:
106
+ - 0
107
+ version: "0"
98
108
  required_rubygems_version: !ruby/object:Gem::Requirement
109
+ none: false
99
110
  requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- segments:
103
- - 0
104
- version: "0"
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
105
117
  requirements: []
106
118
 
107
119
  rubyforge_project: bcrypt-ruby
108
- rubygems_version: 1.3.6
120
+ rubygems_version: 1.8.8
109
121
  signing_key:
110
122
  specification_version: 3
111
123
  summary: OpenBSD's bcrypt() password hashing algorithm.
data/README DELETED
@@ -1,175 +0,0 @@
1
- = bcrypt-ruby
2
-
3
- An easy way to keep your users' passwords secure.
4
-
5
- * http://bcrypt-ruby.rubyforge.org/
6
- * http://github.com/codahale/bcrypt-ruby/tree/master
7
-
8
- == Why you should use bcrypt
9
-
10
- If you store user passwords in the clear, then an attacker who steals a copy of your database has a giant list of emails
11
- and passwords. Some of your users will only have one password -- for their email account, for their banking account, for
12
- your application. A simple hack could escalate into massive identity theft.
13
-
14
- It's your responsibility as a web developer to make your web application secure -- blaming your users for not being
15
- security experts is not a professional response to risk.
16
-
17
- bcrypt allows you to easily harden your application against these kinds of attacks.
18
-
19
- == How to install bcrypt
20
-
21
- sudo gem install bcrypt-ruby
22
-
23
- You'll need a working compiler. (Win32 folks should use Cygwin or um, something else.)
24
-
25
- == How to use bcrypt in your Rails application
26
-
27
- === The +User+ model
28
-
29
- require 'bcrypt'
30
-
31
- class User < ActiveRecord::Base
32
- # users.password_hash in the database is a :string
33
- include BCrypt
34
-
35
- def password
36
- @password ||= Password.new(password_hash)
37
- end
38
-
39
- def password=(new_password)
40
- @password = Password.create(new_password)
41
- self.password_hash = @password
42
- end
43
-
44
- end
45
-
46
- === Creating an account
47
-
48
- def create
49
- @user = User.new(params[:user])
50
- @user.password = params[:password]
51
- @user.save!
52
- end
53
-
54
- === Authenticating a user
55
-
56
- def login
57
- @user = User.find_by_email(params[:email])
58
- if @user.password == params[:password]
59
- give_token
60
- else
61
- redirect_to home_url
62
- end
63
- end
64
-
65
- === If a user forgets their password?
66
-
67
- # assign them a random one and mail it to them, asking them to change it
68
- def forgot_password
69
- @user = User.find_by_email(params[:email])
70
- random_password = Array.new(10).map { (65 + rand(58)).chr }.join
71
- @user.password = random_password
72
- @user.save!
73
- Mailer.create_and_deliver_password_change(@user, random_password)
74
- end
75
-
76
- == How to use bcrypt-ruby in general
77
-
78
- require 'bcrypt'
79
-
80
- my_password = BCrypt::Password.create("my password") #=> "$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa"
81
-
82
- my_password.version #=> "2a"
83
- my_password.cost #=> 10
84
- my_password == "my password" #=> true
85
- my_password == "not my password" #=> false
86
-
87
- my_password = BCrypt::Password.new("$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa")
88
- my_password == "my password" #=> true
89
- my_password == "not my password" #=> false
90
-
91
- Check the rdocs for more details -- BCrypt, BCrypt::Password.
92
-
93
- == How bcrypt() works
94
-
95
- bcrypt() is a hashing algorithm designed by Niels Provos and David Mazières of the OpenBSD Project.
96
-
97
- === Background
98
-
99
- Hash algorithms take a chunk of data (e.g., your user's password) and create a "digital fingerprint," or hash, of it.
100
- Because this process is not reversible, there's no way to go from the hash back to the password.
101
-
102
- In other words:
103
-
104
- hash(p) #=> <unique gibberish>
105
-
106
- You can store the hash and check it against a hash made of a potentially valid password:
107
-
108
- <unique gibberish> =? hash(just_entered_password)
109
-
110
- === Rainbow Tables
111
-
112
- But even this has weaknesses -- attackers can just run lists of possible passwords through the same algorithm, store the
113
- results in a big database, and then look up the passwords by their hash:
114
-
115
- PrecomputedPassword.find_by_hash(<unique gibberish>).password #=> "secret1"
116
-
117
- === Salts
118
-
119
- The solution to this is to add a small chunk of random data -- called a salt -- to the password before it's hashed:
120
-
121
- hash(salt + p) #=> <really unique gibberish>
122
-
123
- The salt is then stored along with the hash in the database, and used to check potentially valid passwords:
124
-
125
- <really unique gibberish> =? hash(salt + just_entered_password)
126
-
127
- bcrypt-ruby automatically handles the storage and generation of these salts for you.
128
-
129
- Adding a salt means that an attacker has to have a gigantic database for each unique salt -- for a salt made of 4
130
- letters, that's 456,976 different databases. Pretty much no one has that much storage space, so attackers try a
131
- different, slower method -- throw a list of potential passwords at each individual password:
132
-
133
- hash(salt + "aadvark") =? <really unique gibberish>
134
- hash(salt + "abacus") =? <really unique gibberish>
135
- etc.
136
-
137
- This is much slower than the big database approach, but most hash algorithms are pretty quick -- and therein lies the
138
- problem. Hash algorithms aren't usually designed to be slow, they're designed to turn gigabytes of data into secure
139
- fingerprints as quickly as possible. bcrypt(), though, is designed to be computationally expensive:
140
-
141
- Ten thousand iterations:
142
- user system total real
143
- md5 0.070000 0.000000 0.070000 ( 0.070415)
144
- bcrypt 22.230000 0.080000 22.310000 ( 22.493822)
145
-
146
- If an attacker was using Ruby to check each password, they could check ~140,000 passwords a second with MD5 but only
147
- ~450 passwords a second with bcrypt().
148
-
149
- === Cost Factors
150
-
151
- In addition, bcrypt() allows you to increase the amount of work required to hash a password as computers get faster. Old
152
- passwords will still work fine, but new passwords can keep up with the times.
153
-
154
- The default cost factor used by bcrypt-ruby is 10, which is fine for session-based authentication. If you are using a
155
- stateless authentication architecture (e.g., HTTP Basic Auth), you will want to lower the cost factor to reduce your
156
- server load and keep your request times down. This will lower the security provided you, but there are few alternatives.
157
-
158
- == More Information
159
-
160
- bcrypt() is currently used as the default password storage hash in OpenBSD, widely regarded as the most secure operating
161
- system available.
162
-
163
-
164
- For a more technical explanation of the algorithm and its design criteria, please read Niels Provos and David Mazières'
165
- Usenix99 paper:
166
- http://www.usenix.org/events/usenix99/provos.html
167
-
168
- If you'd like more down-to-earth advice regarding cryptography, I suggest reading <i>Practical Cryptography</i> by Niels
169
- Ferguson and Bruce Schneier:
170
- http://www.schneier.com/book-practical.html
171
-
172
- = Etc
173
-
174
- Author :: Coda Hale <coda.hale@gmail.com>
175
- Website :: http://blog.codahale.com