encryptor 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +23 -2
- data/lib/encryptor.rb +17 -9
- data/lib/encryptor/string.rb +24 -0
- data/test/encryptor_test.rb +73 -23
- metadata +3 -2
data/README.rdoc
CHANGED
@@ -12,16 +12,38 @@ Used by http://github.com/shuber/attr_encrypted to easily encrypt/decrypt attrib
|
|
12
12
|
|
13
13
|
== Usage
|
14
14
|
|
15
|
-
|
15
|
+
|
16
|
+
=== Basic
|
17
|
+
|
16
18
|
encrypted_value = Encryptor.encrypt(:value => 'some string to encrypt', :key => secret_key) # '������{)��q�ށ�ܣ��q���Au/�ޜP'
|
17
19
|
decrypted_value = Encryptor.decrypt(:value => encrypted_value, :key => secret_key) # 'some string to encrypt'
|
18
20
|
|
21
|
+
The value to encrypt or decrypt may also be passed as the first argument if you'd like.
|
22
|
+
|
23
|
+
secret_key = Digest::SHA256.hexdigest('a secret key')
|
24
|
+
encrypted_value = Encryptor.encrypt('some string to encrypt', :key => secret_key) # '������{)��q�ށ�ܣ��q���Au/�ޜP'
|
25
|
+
decrypted_value = Encryptor.decrypt(encrypted_value, :key => secret_key) # 'some string to encrypt'
|
26
|
+
|
19
27
|
You may also pass the <tt>:iv</tt> and <tt>:algorithm</tt> options but they are not required. If an algorithm is not specified, the Encryptor uses
|
20
28
|
the algorithm found at <tt>Encryptor.default_options[:algorithm]</tt> which is <tt>aes-256-cbc</tt> by default. You can change the default options
|
21
29
|
by overwriting or merging this attribute:
|
22
30
|
|
23
31
|
Encryptor.default_options.merge!(:algorithm => 'bf', :key => 'some default secret key')
|
24
32
|
|
33
|
+
|
34
|
+
=== Strings
|
35
|
+
|
36
|
+
<tt>Encryptor</tt> adds <tt>encrypt</tt> and <tt>decrypt</tt> methods to <tt>String</tt> objects for your convenience. These two methods accept the same arguments as the associated ones in the <tt>Encryptor</tt> module. There nice when you set the default options in the <tt>Encryptor.default_options</tt> attribute. For example:
|
37
|
+
|
38
|
+
Encryptor.default_options.merge!(:key => 'some default secret key')
|
39
|
+
credit_card = 'xxxx xxxx xxxx 1234'
|
40
|
+
encrypted_credit_card = credit_card.encrypt
|
41
|
+
|
42
|
+
There's also <tt>encrypt!</tt> and <tt>decrypt!</tt> methods that replace the contents of a string with the encrypted or decrypted version of itself.
|
43
|
+
|
44
|
+
|
45
|
+
=== Algorithms
|
46
|
+
|
25
47
|
Run <tt>openssl list-cipher-commands</tt> in your terminal to view a list all cipher algorithms that are supported on your platform.
|
26
48
|
|
27
49
|
aes-128-cbc
|
@@ -30,7 +52,6 @@ Run <tt>openssl list-cipher-commands</tt> in your terminal to view a list all ci
|
|
30
52
|
aes-192-ecb
|
31
53
|
aes-256-cbc
|
32
54
|
aes-256-ecb
|
33
|
-
base64
|
34
55
|
bf
|
35
56
|
bf-cbc
|
36
57
|
bf-cfb
|
data/lib/encryptor.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'openssl'
|
2
|
+
require 'encryptor/string'
|
2
3
|
|
4
|
+
# A simple wrapper for the standard OpenSSL library
|
3
5
|
module Encryptor
|
4
6
|
# The default options to use when calling the <tt>encrypt</tt> and <tt>decrypt</tt> methods
|
5
7
|
#
|
@@ -16,9 +18,11 @@ module Encryptor
|
|
16
18
|
#
|
17
19
|
# Example
|
18
20
|
#
|
19
|
-
# encrypted_value =
|
20
|
-
|
21
|
-
|
21
|
+
# encrypted_value = Encryptor.encrypt(:value => 'some string to encrypt', :key => 'some secret key')
|
22
|
+
# # or
|
23
|
+
# encrypted_value = Encryptor.encrypt('some string to encrypt', :key => 'some secret key')
|
24
|
+
def self.encrypt(*args)
|
25
|
+
crypt :encrypt, *args
|
22
26
|
end
|
23
27
|
|
24
28
|
# Decrypts a <tt>:value</tt> with a specified <tt>:key</tt>
|
@@ -27,15 +31,17 @@ module Encryptor
|
|
27
31
|
#
|
28
32
|
# Example
|
29
33
|
#
|
30
|
-
# decrypted_value =
|
31
|
-
|
32
|
-
|
34
|
+
# decrypted_value = Encryptor.decrypt(:value => 'some encrypted string', :key => 'some secret key')
|
35
|
+
# # or
|
36
|
+
# decrypted_value = Encryptor.decrypt('some encrypted string', :key => 'some secret key')
|
37
|
+
def self.decrypt(*args)
|
38
|
+
crypt :decrypt, *args
|
33
39
|
end
|
34
40
|
|
35
41
|
protected
|
36
42
|
|
37
|
-
def self.crypt(cipher_method,
|
38
|
-
options = default_options.merge(
|
43
|
+
def self.crypt(cipher_method, *args) #:nodoc:
|
44
|
+
options = default_options.merge(:value => args.first).merge(args.last.is_a?(Hash) ? args.last : {})
|
39
45
|
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm])
|
40
46
|
cipher.send(cipher_method)
|
41
47
|
if options[:iv]
|
@@ -47,4 +53,6 @@ module Encryptor
|
|
47
53
|
result = cipher.update(options[:value])
|
48
54
|
result << cipher.final
|
49
55
|
end
|
50
|
-
end
|
56
|
+
end
|
57
|
+
|
58
|
+
String.send :include, Encryptor::String
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Encryptor #:nodoc:
|
2
|
+
# Adds <tt>encrypt</tt> and <tt>decrypt</tt> methods to strings
|
3
|
+
module String
|
4
|
+
# Returns a new string containing the encrypted version of itself
|
5
|
+
def encrypt(options = {})
|
6
|
+
Encryptor.encrypt(options.merge(:value => self))
|
7
|
+
end
|
8
|
+
|
9
|
+
# Replaces the contents of a string with the encrypted version of itself
|
10
|
+
def encrypt!(options ={})
|
11
|
+
replace encrypt(options)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns a new string containing the decrypted version of itself
|
15
|
+
def decrypt(options = {})
|
16
|
+
Encryptor.decrypt(options.merge(:value => self))
|
17
|
+
end
|
18
|
+
|
19
|
+
# Replaces the contents of a string with the decrypted version of itself
|
20
|
+
def decrypt!(options ={})
|
21
|
+
replace decrypt(options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/test/encryptor_test.rb
CHANGED
@@ -4,40 +4,90 @@ require File.dirname(__FILE__) + '/../lib/encryptor'
|
|
4
4
|
|
5
5
|
class EncryptorTest < Test::Unit::TestCase
|
6
6
|
|
7
|
-
algorithms = %x(openssl list-cipher-commands).split
|
8
|
-
original_value = Digest::SHA256.hexdigest(([Time.now.to_s] * rand(3)).join)
|
7
|
+
algorithms = %x(openssl list-cipher-commands).split
|
9
8
|
key = Digest::SHA256.hexdigest(([Time.now.to_s] * rand(3)).join)
|
10
9
|
iv = Digest::SHA256.hexdigest(([Time.now.to_s] * rand(3)).join)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
original_value = Digest::SHA256.hexdigest(([Time.now.to_s] * rand(3)).join)
|
11
|
+
|
12
|
+
algorithms.reject { |algorithm| algorithm == 'base64' }.each do |algorithm|
|
13
|
+
encrypted_value_with_iv = Encryptor.encrypt(:value => original_value, :key => key, :iv => iv, :algorithm => algorithm)
|
14
|
+
encrypted_value_without_iv = Encryptor.encrypt(:value => original_value, :key => key, :algorithm => algorithm)
|
15
|
+
|
16
|
+
define_method "test_should_crypt_with_the_#{algorithm}_algorithm_with_iv" do
|
17
|
+
assert_not_equal original_value, encrypted_value_with_iv
|
18
|
+
assert_not_equal encrypted_value_without_iv, encrypted_value_with_iv
|
19
|
+
assert_equal original_value, Encryptor.decrypt(:value => encrypted_value_with_iv, :key => key, :iv => iv, :algorithm => algorithm)
|
18
20
|
end
|
19
21
|
|
20
|
-
define_method "
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
define_method "test_should_crypt_with_the_#{algorithm}_algorithm_without_iv" do
|
23
|
+
assert_not_equal original_value, encrypted_value_without_iv
|
24
|
+
assert_equal original_value, Encryptor.decrypt(:value => encrypted_value_without_iv, :key => key, :algorithm => algorithm)
|
25
|
+
end
|
26
|
+
|
27
|
+
define_method "test_should_encrypt_with_the_#{algorithm}_algorithm_with_iv_with_the_first_arg_as_the_value" do
|
28
|
+
assert_equal encrypted_value_with_iv, Encryptor.encrypt(original_value, :key => key, :iv => iv, :algorithm => algorithm)
|
29
|
+
end
|
30
|
+
|
31
|
+
define_method "test_should_encrypt_with_the_#{algorithm}_algorithm_without_iv_with_the_first_arg_as_the_value" do
|
32
|
+
assert_equal encrypted_value_without_iv, Encryptor.encrypt(original_value, :key => key, :algorithm => algorithm)
|
33
|
+
end
|
34
|
+
|
35
|
+
define_method "test_should_decrypt_with_the_#{algorithm}_algorithm_with_iv_with_the_first_arg_as_the_value" do
|
36
|
+
assert_equal original_value, Encryptor.decrypt(encrypted_value_with_iv, :key => key, :iv => iv, :algorithm => algorithm)
|
37
|
+
end
|
38
|
+
|
39
|
+
define_method "test_should_decrypt_with_the_#{algorithm}_algorithm_without_iv_with_the_first_arg_as_the_value" do
|
40
|
+
assert_equal original_value, Encryptor.decrypt(encrypted_value_without_iv, :key => key, :algorithm => algorithm)
|
41
|
+
end
|
42
|
+
|
43
|
+
define_method "test_should_call_encrypt_on_a_string_with_the_#{algorithm}_algorithm_with_iv" do
|
44
|
+
assert_equal encrypted_value_with_iv, original_value.encrypt(:key => key, :iv => iv, :algorithm => algorithm)
|
45
|
+
end
|
46
|
+
|
47
|
+
define_method "test_should_call_encrypt_on_a_string_with_the_#{algorithm}_algorithm_without_iv" do
|
48
|
+
assert_equal encrypted_value_without_iv, original_value.encrypt(:key => key, :algorithm => algorithm)
|
49
|
+
end
|
50
|
+
|
51
|
+
define_method "test_should_call_decrypt_on_a_string_with_the_#{algorithm}_algorithm_with_iv" do
|
52
|
+
assert_equal original_value, encrypted_value_with_iv.decrypt(:key => key, :iv => iv, :algorithm => algorithm)
|
53
|
+
end
|
54
|
+
|
55
|
+
define_method "test_should_call_decrypt_on_a_string_with_the_#{algorithm}_algorithm_without_iv" do
|
56
|
+
assert_equal original_value, encrypted_value_without_iv.decrypt(:key => key, :algorithm => algorithm)
|
57
|
+
end
|
58
|
+
|
59
|
+
define_method "test_string_encrypt!_on_a_string_with_the_#{algorithm}_algorithm_with_iv" do
|
60
|
+
original_value_dup = original_value.dup
|
61
|
+
original_value_dup.encrypt!(:key => key, :iv => iv, :algorithm => algorithm)
|
62
|
+
assert_equal original_value.encrypt(:key => key, :iv => iv, :algorithm => algorithm), original_value_dup
|
63
|
+
end
|
64
|
+
|
65
|
+
define_method "test_string_encrypt!_on_a_string_with_the_#{algorithm}_algorithm_without_iv" do
|
66
|
+
original_value_dup = original_value.dup
|
67
|
+
original_value_dup.encrypt!(:key => key, :algorithm => algorithm)
|
68
|
+
assert_equal original_value.encrypt(:key => key, :algorithm => algorithm), original_value_dup
|
69
|
+
end
|
70
|
+
|
71
|
+
define_method "test_string_decrypt!_on_a_string_with_the_#{algorithm}_algorithm_with_iv" do
|
72
|
+
encrypted_value_with_iv_dup = encrypted_value_with_iv.dup
|
73
|
+
encrypted_value_with_iv_dup.decrypt!(:key => key, :iv => iv, :algorithm => algorithm)
|
74
|
+
assert_equal original_value, encrypted_value_with_iv_dup
|
75
|
+
end
|
76
|
+
|
77
|
+
define_method "test_string_decrypt!_on_a_string_with_the_#{algorithm}_algorithm_without_iv" do
|
78
|
+
encrypted_value_without_iv_dup = encrypted_value_without_iv.dup
|
79
|
+
encrypted_value_without_iv_dup.decrypt!(:key => key, :algorithm => algorithm)
|
80
|
+
assert_equal original_value, encrypted_value_without_iv_dup
|
24
81
|
end
|
25
|
-
end
|
26
|
-
|
27
|
-
define_method 'test_should_have_a_default_algorithm' do
|
28
|
-
assert algorithms.include?(Encryptor.default_options[:algorithm])
|
29
82
|
end
|
30
83
|
|
31
84
|
define_method 'test_should_use_the_default_algorithm_if_one_is_not_specified' do
|
32
85
|
assert_equal Encryptor.encrypt(:value => original_value, :key => key, :algorithm => Encryptor.default_options[:algorithm]), Encryptor.encrypt(:value => original_value, :key => key)
|
33
86
|
end
|
34
87
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
Encryptor.default_options[:algorithm] = 'test'
|
39
|
-
assert_equal 'test', Encryptor.default_options[:algorithm]
|
40
|
-
Encryptor.default_options[:algorithm] = original_algorithm
|
88
|
+
def test_should_have_a_default_algorithm
|
89
|
+
assert !Encryptor.default_options[:algorithm].nil?
|
90
|
+
assert !Encryptor.default_options[:algorithm].empty?
|
41
91
|
end
|
42
92
|
|
43
93
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: encryptor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Huber
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-29 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,6 +23,7 @@ extra_rdoc_files: []
|
|
23
23
|
|
24
24
|
files:
|
25
25
|
- lib/encryptor.rb
|
26
|
+
- lib/encryptor/string.rb
|
26
27
|
- MIT-LICENSE
|
27
28
|
- Rakefile
|
28
29
|
- README.rdoc
|