secure_yaml 2.0.1 → 2.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/README.md +10 -1
- data/lib/secure_yaml.rb +4 -0
- data/lib/secure_yaml/cli/property_encryption_application.rb +9 -4
- data/lib/secure_yaml/version.rb +1 -1
- data/lib/secure_yaml/yaml_decrypter.rb +3 -1
- data/spec/integration/secure_yaml_spec.rb +10 -2
- data/spec/secure_yaml_spec.rb +10 -1
- data/spec/unit/secure_yaml/cli/property_encryption_application_spec.rb +3 -3
- data/spec/unit/secure_yaml/yaml_decrypter_spec.rb +18 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -19,7 +19,7 @@ This library attempts to address this concern by allowing sensitive information
|
|
19
19
|
The gem provides a simple command line utility called ```encrypt_property_for_yaml``` that prints out the encrypted form of a plain text property.
|
20
20
|
|
21
21
|
```
|
22
|
-
USAGE: encrypt_property_for_yaml <SECRET_KEY> <PROPERTY_VALUE_TO_ENCRYPT>
|
22
|
+
USAGE: encrypt_property_for_yaml encrypt|decrypt <SECRET_KEY> <PROPERTY_VALUE_TO_ENCRYPT>
|
23
23
|
```
|
24
24
|
|
25
25
|
For example:
|
@@ -74,6 +74,15 @@ decrypted_yaml = SecureYaml::load(File.open('database.yml'), {
|
|
74
74
|
```
|
75
75
|
|
76
76
|
<br />
|
77
|
+
<strong>4) Parse and use the decrypted version of a YAML string within your app</strong>
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
require 'secure_yaml'
|
81
|
+
|
82
|
+
decrypted_yaml = SecureYaml::parse("some correctly formatted yaml text")
|
83
|
+
```
|
84
|
+
<br />
|
85
|
+
|
77
86
|
### Customising decryption
|
78
87
|
|
79
88
|
The default decryption method applied by this library when loading a YAML file is [AES-256-CFB](http://en.wikipedia.org/wiki/Advanced_Encryption_Standard).
|
data/lib/secure_yaml.rb
CHANGED
@@ -14,6 +14,10 @@ module SecureYaml
|
|
14
14
|
yaml_loader(opts[:decryption_algorithm], retrieve_secret_key(opts[:secret_key_property_name])).load(yaml_file)
|
15
15
|
end
|
16
16
|
|
17
|
+
def self.parse(yaml, opts = {})
|
18
|
+
load(StringIO.new(yaml), opts)
|
19
|
+
end
|
20
|
+
|
17
21
|
private
|
18
22
|
|
19
23
|
def self.retrieve_secret_key(secret_key_prop_name)
|
@@ -6,12 +6,17 @@ module SecureYaml
|
|
6
6
|
|
7
7
|
def execute(command_line_args)
|
8
8
|
|
9
|
-
raise "USAGE: encrypt_property_for_yaml <SECRET_KEY> <PROPERTY_VALUE_TO_ENCRYPT>" unless command_line_args.length ==
|
9
|
+
raise "USAGE: encrypt_property_for_yaml encrypt|decrypt <SECRET_KEY> <PROPERTY_VALUE_TO_ENCRYPT>" unless command_line_args.length == 3
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
mode = command_line_args[0]
|
12
|
+
secret_key = command_line_args[1]
|
13
|
+
plain_text = command_line_args[2]
|
13
14
|
|
14
|
-
|
15
|
+
if mode == 'encrypt'
|
16
|
+
puts "#{ENCRYPTED_PROPERTY_WRAPPER_ID}(#{Cipher.new.encrypt(secret_key, plain_text)})"
|
17
|
+
else
|
18
|
+
puts Cipher.new.decrypt(secret_key, plain_text)
|
19
|
+
end
|
15
20
|
end
|
16
21
|
|
17
22
|
end
|
data/lib/secure_yaml/version.rb
CHANGED
@@ -14,7 +14,9 @@ module SecureYaml
|
|
14
14
|
when Hash
|
15
15
|
yaml.inject({}) {|new_hash, (key, value)| new_hash[key] = decrypt(value); new_hash}
|
16
16
|
when String
|
17
|
-
yaml.gsub(
|
17
|
+
yaml.gsub(/\b#{ENCRYPTED_PROPERTY_WRAPPER_ID}\((.*)\)(?:\b|$)/) {@decryption_algorithm.decrypt(@secret_key, $1)}
|
18
|
+
when Array
|
19
|
+
yaml.map {|element| decrypt(element)}
|
18
20
|
else
|
19
21
|
yaml
|
20
22
|
end
|
@@ -8,13 +8,13 @@ describe 'SecureYaml' do
|
|
8
8
|
@test_yaml_file = File.open('spec/fixtures/test.yml')
|
9
9
|
end
|
10
10
|
|
11
|
-
it 'should load
|
11
|
+
it 'should load encrypted yaml file using default decryption algorithm' do
|
12
12
|
yaml = SecureYaml::load(@test_yaml_file)
|
13
13
|
|
14
14
|
yaml.should == {'plain_prop' => '1234', 'encrypted_prop' => 'secret-text'}
|
15
15
|
end
|
16
16
|
|
17
|
-
it 'should
|
17
|
+
it 'should decrypt yaml using custom decryption algorithm' do
|
18
18
|
custom_decryption_algorithm = Class.new {
|
19
19
|
def self.decrypt(secret_key, encrypted_data)
|
20
20
|
"decrypted!"
|
@@ -26,4 +26,12 @@ describe 'SecureYaml' do
|
|
26
26
|
yaml.should == {'plain_prop' => '1234', 'encrypted_prop' => 'decrypted!'}
|
27
27
|
end
|
28
28
|
|
29
|
+
it 'should parse encrypted yaml string using default decryption algorithm' do
|
30
|
+
encrypted_yaml_str = {:plain_prop => '1234', :encrypted_prop => 'ENC(EBnrEqmvC5BbOXw=)'}.to_yaml
|
31
|
+
|
32
|
+
yaml = SecureYaml::parse(encrypted_yaml_str)
|
33
|
+
|
34
|
+
yaml.should == {:plain_prop => '1234', :encrypted_prop => 'secret-text'}
|
35
|
+
end
|
36
|
+
|
29
37
|
end
|
data/spec/secure_yaml_spec.rb
CHANGED
@@ -16,7 +16,7 @@ describe 'SecureYaml' do
|
|
16
16
|
@loader.stub(:load).and_return(@yaml)
|
17
17
|
end
|
18
18
|
|
19
|
-
it 'should load
|
19
|
+
it 'should load encrypted yaml file' do
|
20
20
|
ENV[SecureYaml::DEFAULT_SECRET_KEY_PROP_NAME] = @secret_key
|
21
21
|
SecureYaml::YamlDecrypter.stub(:new).with(@default_decryption_algorithm, @secret_key).and_return(@yaml_decrypter)
|
22
22
|
|
@@ -25,6 +25,15 @@ describe 'SecureYaml' do
|
|
25
25
|
yaml.should == @yaml
|
26
26
|
end
|
27
27
|
|
28
|
+
it 'should parse encrypted yaml string' do
|
29
|
+
ENV[SecureYaml::DEFAULT_SECRET_KEY_PROP_NAME] = @secret_key
|
30
|
+
SecureYaml::YamlDecrypter.stub(:new).with(@default_decryption_algorithm, @secret_key).and_return(@yaml_decrypter)
|
31
|
+
|
32
|
+
yaml = SecureYaml::parse("")
|
33
|
+
|
34
|
+
yaml.should == @yaml
|
35
|
+
end
|
36
|
+
|
28
37
|
it 'should raise error on load if secret key env property not set' do
|
29
38
|
ENV[SecureYaml::DEFAULT_SECRET_KEY_PROP_NAME] = nil
|
30
39
|
|
@@ -15,7 +15,7 @@ describe 'Property encryption command line interface' do
|
|
15
15
|
|
16
16
|
$stdout.should_receive(:puts).with("#{SecureYaml::ENCRYPTED_PROPERTY_WRAPPER_ID}(#{@encrypted_text})")
|
17
17
|
|
18
|
-
SecureYaml::PropertyEncryptionApplication.new.execute([@secret_key, @plain_text])
|
18
|
+
SecureYaml::PropertyEncryptionApplication.new.execute(["encrypt", @secret_key, @plain_text])
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'should raise error unless secret key and plain text have been included as command line args' do
|
@@ -24,7 +24,7 @@ describe 'Property encryption command line interface' do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'should raise error if too many comand line args' do
|
27
|
-
expect {SecureYaml::PropertyEncryptionApplication.new.execute([@secret_key, @plain_text, 'unexpected'])}.to raise_error
|
27
|
+
expect {SecureYaml::PropertyEncryptionApplication.new.execute(["encrypt", @secret_key, @plain_text, 'unexpected'])}.to raise_error
|
28
28
|
end
|
29
29
|
|
30
|
-
end
|
30
|
+
end
|
@@ -10,6 +10,14 @@ describe 'Yaml decrypter' do
|
|
10
10
|
@plain_text = 'some plain text'
|
11
11
|
end
|
12
12
|
|
13
|
+
it 'should decrypt encoded values in plain strings' do
|
14
|
+
encrypted_data = 'encrypted data'
|
15
|
+
@cipher.stub(:decrypt).with(@secret_key, encrypted_data).and_return(@decrypted_result)
|
16
|
+
hash = {:encrypted_prop => "ENC(#{encrypted_data})", :plain_prop => @plain_text}
|
17
|
+
data = @decrypter.decrypt(hash.to_yaml)
|
18
|
+
YAML.load(data).should == {:encrypted_prop => @decrypted_result, :plain_prop => @plain_text}
|
19
|
+
end
|
20
|
+
|
13
21
|
it 'should decrypt only marked encrypted properties' do
|
14
22
|
encrypted_data = 'encrypted data'
|
15
23
|
@cipher.stub(:decrypt).with(@secret_key, encrypted_data).and_return(@decrypted_result)
|
@@ -44,6 +52,15 @@ describe 'Yaml decrypter' do
|
|
44
52
|
data.should == {:parent_prop => {:nested_prop => @decrypted_result, :parent_prop_2 => {:nested_prop_2 => @decrypted_result}}}
|
45
53
|
end
|
46
54
|
|
55
|
+
it 'should decrypt encrypted properties of array elements' do
|
56
|
+
encrypted_data = 'encrypted data'
|
57
|
+
@cipher.stub(:decrypt).and_return(@decrypted_result)
|
58
|
+
|
59
|
+
data = @decrypter.decrypt([{:encrypted_prop => "ENC(#{encrypted_data})"}])
|
60
|
+
|
61
|
+
data.should == [{:encrypted_prop => @decrypted_result}]
|
62
|
+
end
|
63
|
+
|
47
64
|
it 'should ignore any property of non-string type' do
|
48
65
|
numeric_prop = {:numeric => 1}
|
49
66
|
|
@@ -52,4 +69,4 @@ describe 'Yaml decrypter' do
|
|
52
69
|
data.should == numeric_prop
|
53
70
|
end
|
54
71
|
|
55
|
-
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: secure_yaml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-02-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|