bcrypt-ruby 2.1.4-java → 3.0.0-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -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