ezcrypto 0.1.1 → 0.2
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/CHANGELOG +10 -0
- data/README +1 -1
- data/README_ACTIVE_CRYPTO +110 -0
- data/lib/CVS/Entries +2 -0
- data/lib/active_crypto.rb +254 -0
- data/lib/ezcrypto.rb +5 -5
- data/rakefile +5 -2
- data/test/CVS/Entries +1 -0
- metadata +5 -3
data/CHANGELOG
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
0.2 October 30th, 2005 Ruby on Rails integration
|
2
|
+
|
3
|
+
As promised I have now included my first version of ActiveCrypto the crypto layer for ActiveRecord and Ruby on Rails.
|
4
|
+
|
5
|
+
0.1.1 August 27, 2005 Minor fixes
|
6
|
+
|
7
|
+
Thanks to Jason Vasquez mugatu at mugfu dot com for noticing that Key#to_s
|
8
|
+
called the nonexistent encoded method.
|
9
|
+
|
10
|
+
I also made a few slight changes to the documentation.
|
data/README
CHANGED
@@ -0,0 +1,110 @@
|
|
1
|
+
= ActiveCrypto - Easy to use Crypto for Ruby on Rails
|
2
|
+
|
3
|
+
ActiveCrypto is based on EzCrypto and provides application oriented crypto support for Ruby on Rails applications.
|
4
|
+
|
5
|
+
== Features
|
6
|
+
|
7
|
+
* Transparent encryption/decryption
|
8
|
+
* Ruby on Rails like domain language
|
9
|
+
|
10
|
+
== Simple examples
|
11
|
+
|
12
|
+
==== A simple encrypted class
|
13
|
+
|
14
|
+
You specify in your class which fields are encrypted:
|
15
|
+
|
16
|
+
class Document < ActiveRecord::Base
|
17
|
+
encrypt :title,:body
|
18
|
+
end
|
19
|
+
|
20
|
+
Two encrypt it you need to enter a key. For ease of use there is a method called enter_password which sets the key based on a password of your choice.
|
21
|
+
|
22
|
+
doc=Document.new
|
23
|
+
doc.enter_password "This stuff is secret man!!!"
|
24
|
+
doc.title="Plan to take over the world"
|
25
|
+
doc.body="Write apps in Rails"
|
26
|
+
doc.save
|
27
|
+
|
28
|
+
This needs to be done as well if you want to read your document:
|
29
|
+
|
30
|
+
doc=Document.find 1
|
31
|
+
doc.enter_password "This stuff is secret man!!!"
|
32
|
+
puts doc.name
|
33
|
+
|
34
|
+
If you don't remember to set a key it will through a MissingKeyError.
|
35
|
+
|
36
|
+
==== More realistic example with KeyHolder
|
37
|
+
|
38
|
+
It probably isn't much use if each record needs its own key. The solution to this is the KeyHolder. A KeyHolder is an object that holds keys for use by other objects. A typical example would be a user.
|
39
|
+
|
40
|
+
class User < ActiveRecord::Base
|
41
|
+
has_many :documents
|
42
|
+
keyholder
|
43
|
+
end
|
44
|
+
|
45
|
+
We use standard ActiveRecord associations to associate the User with his documents. We also need to specify that he is a keyholder. We now modify our Document class as follows:
|
46
|
+
|
47
|
+
class Document < ActiveRecord::Base
|
48
|
+
belongs_to :user
|
49
|
+
encrypt :title,:body,:key=>:user
|
50
|
+
end
|
51
|
+
|
52
|
+
We have the standard associations going on here, but we have also added the option :key=>:user to the encrypt statement. Now we could do this:
|
53
|
+
|
54
|
+
@user=User.new
|
55
|
+
@user.enter_password "This stuff is secret man!!!"
|
56
|
+
@user.save
|
57
|
+
|
58
|
+
@doc=Document.new
|
59
|
+
@doc.user=@user
|
60
|
+
@doc.title="Plan to take over the world"
|
61
|
+
@doc.body="Write apps in Rails"
|
62
|
+
@doc.save
|
63
|
+
|
64
|
+
You could also do ordinary rails like stuf such as:
|
65
|
+
|
66
|
+
@user.documents.each do |doc|
|
67
|
+
puts doc.name
|
68
|
+
end
|
69
|
+
|
70
|
+
Decryption is done transparently.
|
71
|
+
|
72
|
+
When doing this within a rails application, active_crypto automatically maintains a list of keys for each user session. Besides the 2 steps below you don't need to do anything special within your controller.
|
73
|
+
|
74
|
+
1. When a user logs on with a password enter his password like this:
|
75
|
+
|
76
|
+
@user.enter_password @params['password']
|
77
|
+
|
78
|
+
2. When a user logs off call the following
|
79
|
+
|
80
|
+
clear_session_keys
|
81
|
+
|
82
|
+
== Usage as a Rails plugin
|
83
|
+
|
84
|
+
Just unpack it into your $MY_RAILS_PROJECTS/vendor/plugins folder to use it as a self contained plugin. Otherwise you can install it as a gem using:
|
85
|
+
|
86
|
+
$ gem install ezcrypto
|
87
|
+
|
88
|
+
Then make sure to require "active_crypto.rb" at the end of your environment.rb file.
|
89
|
+
|
90
|
+
== Database Schema issues
|
91
|
+
|
92
|
+
ActiveCrypto doesn't really care about the schema, but that said you do need a schema that will accept and not mangle it's output. On MySQL I normally use TINYBLOB instead of VARCHAR and BLOB instead of TEXT.
|
93
|
+
|
94
|
+
== License
|
95
|
+
|
96
|
+
EzCrypto and ActionCrypto is released under the MIT license.
|
97
|
+
|
98
|
+
|
99
|
+
== Support
|
100
|
+
|
101
|
+
To contact the author, send mail to pelleb@gmail.com
|
102
|
+
|
103
|
+
Also see my blogs at:
|
104
|
+
http://stakeventures.com and
|
105
|
+
http://neubia.com
|
106
|
+
|
107
|
+
This project was based on code used in my project StakeItOut, where you can securely share web services with your partners.
|
108
|
+
https://stakeitout.com
|
109
|
+
|
110
|
+
(C) 2005 Pelle Braendgaard
|
data/lib/CVS/Entries
CHANGED
@@ -0,0 +1,254 @@
|
|
1
|
+
require "ezCrypto"
|
2
|
+
module ActiveRecord # :nodoc:
|
3
|
+
module Crypto #:nodoc:
|
4
|
+
|
5
|
+
def self.append_features(base) #:nodoc:
|
6
|
+
super
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
=begin rdoc
|
11
|
+
|
12
|
+
Usage is very simple. You will generally only need the two class methods listed here in your ActiveRecord class model.
|
13
|
+
|
14
|
+
== License
|
15
|
+
|
16
|
+
ActiveCrypto and EzCrypto are released under the MIT license.
|
17
|
+
|
18
|
+
|
19
|
+
== Support
|
20
|
+
|
21
|
+
To contact the author, send mail to pelleb@gmail.com
|
22
|
+
|
23
|
+
Also see my blogs at:
|
24
|
+
http://stakeventures.com and
|
25
|
+
http://neubia.com
|
26
|
+
|
27
|
+
This project was based on code used in my project StakeItOut, where you can securely share web services with your partners.
|
28
|
+
https://stakeitout.com
|
29
|
+
|
30
|
+
(C) 2005 Pelle Braendgaard
|
31
|
+
|
32
|
+
=end
|
33
|
+
module ClassMethods
|
34
|
+
@@session_keys={}
|
35
|
+
|
36
|
+
=begin rdoc
|
37
|
+
Turn encryption on for this record. List all encrypted attributes
|
38
|
+
|
39
|
+
class Document < ActiveRecord::Base
|
40
|
+
encrypt :title,:body
|
41
|
+
end
|
42
|
+
|
43
|
+
Include optional option :key, to specify an external KeyHolder, which holds the key used for encrypting and decrypting:
|
44
|
+
|
45
|
+
class Document < ActiveRecord::Base
|
46
|
+
belongs_to :user
|
47
|
+
encrypt :title,:body,:key=>:user
|
48
|
+
end
|
49
|
+
|
50
|
+
=end
|
51
|
+
def encrypt(*attributes)
|
52
|
+
include ActiveRecord::Crypto::Encrypted
|
53
|
+
alias_method :orig_write_attribute, :write_attribute
|
54
|
+
alias_method :write_attribute,:write_encrypted_attribute
|
55
|
+
options=attributes.last.is_a?(Hash) ? attributes.pop : {}
|
56
|
+
if options and options[:key]
|
57
|
+
module_eval <<-"end;"
|
58
|
+
def session_key
|
59
|
+
(send :#{options[:key]} ).send :session_key
|
60
|
+
end
|
61
|
+
end;
|
62
|
+
|
63
|
+
end
|
64
|
+
self.encrypted_attributes=attributes
|
65
|
+
for enc in attributes
|
66
|
+
|
67
|
+
module_eval <<-"end;"
|
68
|
+
def #{enc.to_s}
|
69
|
+
_decrypt(read_attribute("#{enc.to_s}"))
|
70
|
+
end
|
71
|
+
end;
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
=begin rdoc
|
76
|
+
Creates support in this class for holding a key. Adds the following methods:
|
77
|
+
|
78
|
+
* enter_password(password,salt="onetwothree")
|
79
|
+
* set_session_key(key)
|
80
|
+
* session_key
|
81
|
+
|
82
|
+
Use it as follows:
|
83
|
+
|
84
|
+
class User < ActiveRecord::Base
|
85
|
+
has_many :documents
|
86
|
+
keyholder
|
87
|
+
end
|
88
|
+
|
89
|
+
=end
|
90
|
+
def keyholder()
|
91
|
+
include ActiveRecord::Crypto::KeyHolder
|
92
|
+
end
|
93
|
+
|
94
|
+
=begin rdoc
|
95
|
+
Clears the session_key array. Generally this is handled automatically as a filter in ActionController. Only use these if you need to
|
96
|
+
do something out of the ordinary.
|
97
|
+
=end
|
98
|
+
def clear_session_keys() #:nodoc:
|
99
|
+
@@session_keys.clear
|
100
|
+
end
|
101
|
+
|
102
|
+
=begin rdoc
|
103
|
+
Sets the session_keys array. Only use these if you need to
|
104
|
+
do something out of the ordinary, as it is handled
|
105
|
+
=end
|
106
|
+
def session_keys=(keys) #:nodoc:
|
107
|
+
@@session_keys=keys
|
108
|
+
end
|
109
|
+
|
110
|
+
def session_keys() #:nodoc:
|
111
|
+
@@session_keys
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
=begin rdoc
|
116
|
+
This module handles all standard key management features.
|
117
|
+
=end
|
118
|
+
module KeyHolder
|
119
|
+
|
120
|
+
=begin rdoc
|
121
|
+
Creates a key for object based on given password and an optional salt.
|
122
|
+
=end
|
123
|
+
def enter_password(password,salt="onetwothree")
|
124
|
+
set_session_key(EzCrypto::Key.with_password password, salt)
|
125
|
+
end
|
126
|
+
|
127
|
+
=begin rdoc
|
128
|
+
Sets a session key for the object. This should be a EzCrypto::Key instance.
|
129
|
+
=end
|
130
|
+
def set_session_key(key)
|
131
|
+
Base.session_keys[session_key_id]=key
|
132
|
+
end
|
133
|
+
|
134
|
+
=begin rdoc
|
135
|
+
Returns the session_key
|
136
|
+
=end
|
137
|
+
def session_key
|
138
|
+
Base.session_keys[session_key_id]
|
139
|
+
end
|
140
|
+
|
141
|
+
private
|
142
|
+
|
143
|
+
def session_key_id
|
144
|
+
"#{self.class.to_s}:#{id}"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
module Encrypted #:nodoc:
|
149
|
+
include ActiveRecord::Crypto::KeyHolder
|
150
|
+
def self.append_features(base) #:nodoc:
|
151
|
+
super
|
152
|
+
base.module_eval <<-"end;"
|
153
|
+
@@encrypted_attributes=[]
|
154
|
+
def encrypted_attributes
|
155
|
+
@@encrypted_attributes
|
156
|
+
end
|
157
|
+
|
158
|
+
def #{base.to_s}.encrypted_attributes=(attrs)
|
159
|
+
@@encrypted_attributes=attrs
|
160
|
+
end
|
161
|
+
end;
|
162
|
+
end
|
163
|
+
|
164
|
+
def write_encrypted_attribute(name,value)
|
165
|
+
if encrypted_attributes.include?(name.to_sym)
|
166
|
+
orig_write_attribute(name,_encrypt(value))
|
167
|
+
else
|
168
|
+
orig_write_attribute(name,value)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
private
|
174
|
+
|
175
|
+
def _decrypt(data)
|
176
|
+
if session_key.nil?
|
177
|
+
raise MissingKeyError
|
178
|
+
else
|
179
|
+
session_key.decrypt(data)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def _encrypt(data)
|
184
|
+
if session_key.nil?
|
185
|
+
raise MissingKeyError
|
186
|
+
else
|
187
|
+
session_key.encrypt(data)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
|
193
|
+
class Base # :nodoc:
|
194
|
+
include ActiveRecord::Crypto
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
module ActionController # :nodoc:
|
199
|
+
=begin rdoc
|
200
|
+
This includes some basic support in the ActionController for handling session keys. It creates two filters one before the action and one after.
|
201
|
+
These do the following:
|
202
|
+
|
203
|
+
If the users session already has a 'session_keys' value it loads it into the ActiveRecord::Base.session_keys class field. If not it
|
204
|
+
clears any existing session_keys.
|
205
|
+
|
206
|
+
Leaving the action it stores any session_keys in the corresponding session variable.
|
207
|
+
|
208
|
+
These filters are automatically enabled. You do not have to do anything.
|
209
|
+
|
210
|
+
To manually clear the session keys call clear_session_keys. This should be done for example as part of a session log off action.
|
211
|
+
=end
|
212
|
+
module CryptoSupport
|
213
|
+
|
214
|
+
def self.append_features(base) #:nodoc:
|
215
|
+
super
|
216
|
+
base.send :prepend_before_filter, :load_session_keys
|
217
|
+
base.send :prepend_after_filter, :save_session_keys
|
218
|
+
end
|
219
|
+
|
220
|
+
=begin rdoc
|
221
|
+
Clears the session keys. Call this when a user logs of.
|
222
|
+
=end
|
223
|
+
def clear_session_keys
|
224
|
+
ActiveRecord::Base.clear_session_keys
|
225
|
+
end
|
226
|
+
|
227
|
+
|
228
|
+
private
|
229
|
+
def load_session_keys
|
230
|
+
if @session['session_keys']
|
231
|
+
ActiveRecord::Base.session_keys=@session['session_keys']
|
232
|
+
else
|
233
|
+
ActiveRecord::Base.clear_session_keys
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def save_session_keys
|
238
|
+
if ActiveRecord::Base.session_keys.size>0
|
239
|
+
@session['session_keys']=ActiveRecord::Base.session_keys
|
240
|
+
else
|
241
|
+
@session['session_keys']=nil
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
246
|
+
|
247
|
+
class Base # :nodoc:
|
248
|
+
include CryptoSupport
|
249
|
+
end
|
250
|
+
|
251
|
+
end
|
252
|
+
|
253
|
+
class MissingKeyError < RuntimeError
|
254
|
+
end
|
data/lib/ezcrypto.rb
CHANGED
@@ -3,7 +3,7 @@ require 'digest/sha2'
|
|
3
3
|
require 'digest/sha1'
|
4
4
|
require 'base64'
|
5
5
|
|
6
|
-
module EzCrypto
|
6
|
+
module EzCrypto #:nodoc:
|
7
7
|
|
8
8
|
|
9
9
|
=begin rdoc
|
@@ -22,7 +22,7 @@ Eg.
|
|
22
22
|
|
23
23
|
== License
|
24
24
|
|
25
|
-
|
25
|
+
ActiveCrypto and EzCrypto are released under the MIT license.
|
26
26
|
|
27
27
|
|
28
28
|
== Support
|
@@ -195,7 +195,7 @@ You probably should be using the Key class instead.
|
|
195
195
|
Warning! The interface may change.
|
196
196
|
|
197
197
|
=end
|
198
|
-
class CipherWrapper
|
198
|
+
class CipherWrapper #:nodoc:
|
199
199
|
|
200
200
|
=begin rdoc
|
201
201
|
|
@@ -262,7 +262,7 @@ You probably should be using Key instead.
|
|
262
262
|
Warning! The interface may change.
|
263
263
|
|
264
264
|
=end
|
265
|
-
class Encrypter<EzCrypto::CipherWrapper
|
265
|
+
class Encrypter<EzCrypto::CipherWrapper #:nodoc:
|
266
266
|
|
267
267
|
=begin rdoc
|
268
268
|
|
@@ -286,7 +286,7 @@ You probably should be using Key instead.
|
|
286
286
|
|
287
287
|
Warning! The interface may change.
|
288
288
|
=end
|
289
|
-
class Decrypter<EzCrypto::CipherWrapper
|
289
|
+
class Decrypter<EzCrypto::CipherWrapper #:nodoc:
|
290
290
|
=begin rdoc
|
291
291
|
|
292
292
|
=end
|
data/rakefile
CHANGED
@@ -8,7 +8,7 @@ require 'rake/contrib/rubyforgepublisher'
|
|
8
8
|
|
9
9
|
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
|
10
10
|
PKG_NAME = 'ezcrypto'
|
11
|
-
PKG_VERSION = '0.
|
11
|
+
PKG_VERSION = '0.2' + PKG_BUILD
|
12
12
|
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
13
13
|
|
14
14
|
RELEASE_NAME = "REL #{PKG_VERSION}"
|
@@ -34,7 +34,10 @@ Rake::RDocTask.new { |rdoc|
|
|
34
34
|
rdoc.options << '--line-numbers --inline-source --main README'
|
35
35
|
rdoc.template = "#{ENV['template']}.rb" if ENV['template']
|
36
36
|
rdoc.rdoc_files.include('README')
|
37
|
+
rdoc.rdoc_files.include('README_ACTIVE_CRYPTO')
|
38
|
+
rdoc.rdoc_files.include('CHANGELOG')
|
37
39
|
rdoc.rdoc_files.include('lib/ezcrypto.rb')
|
40
|
+
rdoc.rdoc_files.include('lib/active_crypto.rb')
|
38
41
|
# rdoc.rdoc_files.include('lib/ezcrypto/*.rb')
|
39
42
|
}
|
40
43
|
|
@@ -57,7 +60,7 @@ spec = Gem::Specification.new do |s|
|
|
57
60
|
s.requirements << 'none'
|
58
61
|
s.require_path = 'lib'
|
59
62
|
|
60
|
-
s.files = [ "rakefile", "README", "MIT-LICENSE" ]
|
63
|
+
s.files = [ "rakefile", "README", "README_ACTIVE_CRYPTO", "MIT-LICENSE","CHANGELOG" ]
|
61
64
|
s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
|
62
65
|
s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
|
63
66
|
end
|
data/test/CVS/Entries
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ezcrypto
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2005-
|
6
|
+
version: "0.2"
|
7
|
+
date: 2005-10-30
|
8
8
|
summary: Simplified encryption library.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -29,7 +29,10 @@ authors:
|
|
29
29
|
files:
|
30
30
|
- rakefile
|
31
31
|
- README
|
32
|
+
- README_ACTIVE_CRYPTO
|
32
33
|
- MIT-LICENSE
|
34
|
+
- CHANGELOG
|
35
|
+
- lib/active_crypto.rb
|
33
36
|
- lib/CVS
|
34
37
|
- lib/ezcrypto.rb
|
35
38
|
- lib/CVS/Entries
|
@@ -37,7 +40,6 @@ files:
|
|
37
40
|
- lib/CVS/Root
|
38
41
|
- test/CVS
|
39
42
|
- test/ezcrypto_test.rb
|
40
|
-
- test/fixtures
|
41
43
|
- test/CVS/Entries
|
42
44
|
- test/CVS/Repository
|
43
45
|
- test/CVS/Root
|