attr_keyring 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +9 -1
- data/README.md +16 -1
- data/attr_keyring.gemspec +1 -0
- data/lib/attr_keyring/active_record.rb +23 -6
- data/lib/attr_keyring/version.rb +1 -1
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: caf27704434485775f0d328115de5a7803784efea398278d2ab091f90812fe69
|
4
|
+
data.tar.gz: 52ee0ed25266480a59444793108e5839d5c09064f50f8280bfe5a056ce827046
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6eb5b417fdb67fd63d72d7cb263f26269192658d8b92b498a168163321cd5be68734244494161755911082b509f6cd16b340d253d8b88208b0586831a7c471de
|
7
|
+
data.tar.gz: 68bb5d48c931766027d4e6541044263f16c117d3628577a0a9bf79bddeace82dc25773d8d8b0b387ab24a39c7a58f01e94a6376a74740f0b5f53faaf01e7832d
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
attr_keyring (0.1.
|
4
|
+
attr_keyring (0.1.1)
|
5
5
|
activerecord
|
6
6
|
|
7
7
|
GEM
|
@@ -24,9 +24,11 @@ GEM
|
|
24
24
|
byebug (10.0.2)
|
25
25
|
coderay (1.1.2)
|
26
26
|
concurrent-ruby (1.1.3)
|
27
|
+
docile (1.3.1)
|
27
28
|
i18n (1.1.1)
|
28
29
|
concurrent-ruby (~> 1.0)
|
29
30
|
jaro_winkler (1.5.1)
|
31
|
+
json (2.1.0)
|
30
32
|
method_source (0.9.2)
|
31
33
|
minitest (5.11.3)
|
32
34
|
minitest-utils (0.4.4)
|
@@ -60,6 +62,11 @@ GEM
|
|
60
62
|
ruby-progressbar (~> 1.7)
|
61
63
|
unicode-display_width (~> 1.4.0)
|
62
64
|
ruby-progressbar (1.10.0)
|
65
|
+
simplecov (0.16.1)
|
66
|
+
docile (~> 1.1)
|
67
|
+
json (>= 1.8, < 3)
|
68
|
+
simplecov-html (~> 0.10.0)
|
69
|
+
simplecov-html (0.10.2)
|
63
70
|
slop (3.6.0)
|
64
71
|
sqlite3 (1.3.13)
|
65
72
|
thread_safe (0.3.6)
|
@@ -77,6 +84,7 @@ DEPENDENCIES
|
|
77
84
|
pry-meta
|
78
85
|
rake
|
79
86
|
rubocop
|
87
|
+
simplecov
|
80
88
|
sqlite3
|
81
89
|
|
82
90
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -53,7 +53,22 @@ Keys are managed through a keyring--a short JSON document describing your encryp
|
|
53
53
|
|
54
54
|
The `id` is used to track which key encrypted which piece of data; a key with a larger id is assumed to be newer. The value is the actual bytes of the encryption key.
|
55
55
|
|
56
|
-
|
56
|
+
#### Dynamically loading keyring
|
57
|
+
|
58
|
+
If you're using Rails 5.2+, you can use credentials to define your keyring. Your `credentials.yml` must be define like the following:
|
59
|
+
|
60
|
+
```yaml
|
61
|
+
user_keyring:
|
62
|
+
1: "PV8+EHgJlHfsVVVstJHgEo+3OCSn4iJDzqJs55U650Q="
|
63
|
+
2: "0HyJ15am4haRsCyiFCxDdlKwl3G5yPNKTUbadpaIfPI="
|
64
|
+
```
|
65
|
+
|
66
|
+
Then you can setup your model by using `attr_keyring Rails.application.credentials.user_keyring`.
|
67
|
+
|
68
|
+
Other possibilities (e.g. the keyring file is provided by configuration management):
|
69
|
+
|
70
|
+
- `attr_keyring YAML.load_file(keyring_file)`
|
71
|
+
- `attr_keyring JSON.parse(File.read(keyring_file))`.
|
57
72
|
|
58
73
|
### Model Setup
|
59
74
|
|
data/attr_keyring.gemspec
CHANGED
@@ -16,23 +16,42 @@ module AttrKeyring
|
|
16
16
|
|
17
17
|
def define_attr_encrypt_writer(attribute)
|
18
18
|
define_method("#{attribute}=") do |value|
|
19
|
-
|
19
|
+
return attr_reset_column(attribute) if value.nil?
|
20
|
+
|
21
|
+
stored_keyring_id = public_send(keyring_column_name)
|
22
|
+
keyring_id = stored_keyring_id || keyring.current_key&.id
|
20
23
|
encrypted_value = keyring.encrypt(value, keyring_id)
|
21
24
|
|
25
|
+
public_send("#{keyring_column_name}=", keyring_id) unless stored_keyring_id
|
22
26
|
public_send("encrypted_#{attribute}=", encrypted_value)
|
23
|
-
|
27
|
+
attr_encrypt_digest(attribute, value)
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
27
31
|
def define_attr_encrypt_reader(attribute)
|
28
32
|
define_method(attribute) do
|
33
|
+
encrypted_value = public_send("encrypted_#{attribute}")
|
34
|
+
|
35
|
+
return unless encrypted_value
|
36
|
+
|
29
37
|
keyring_id = public_send(keyring_column_name)
|
30
|
-
keyring.decrypt(
|
38
|
+
keyring.decrypt(encrypted_value, keyring_id)
|
31
39
|
end
|
32
40
|
end
|
33
41
|
end
|
34
42
|
|
35
43
|
module InstanceMethods
|
44
|
+
private def attr_reset_column(attribute)
|
45
|
+
public_send("encrypted_#{attribute}=", nil)
|
46
|
+
public_send("#{attribute}_digest=", nil)
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
|
50
|
+
private def attr_encrypt_digest(attribute, value)
|
51
|
+
digest_column = "#{attribute}_digest"
|
52
|
+
public_send("#{digest_column}=", Digest::SHA256.hexdigest(value)) if respond_to?(digest_column)
|
53
|
+
end
|
54
|
+
|
36
55
|
private def migrate_to_latest_encryption_key
|
37
56
|
keyring_id = keyring.current_key.id
|
38
57
|
|
@@ -41,9 +60,7 @@ module AttrKeyring
|
|
41
60
|
encrypted_value = keyring.encrypt(value, keyring_id)
|
42
61
|
|
43
62
|
public_send("encrypted_#{attribute}=", encrypted_value)
|
44
|
-
|
45
|
-
digest_column = "#{attribute}_digest"
|
46
|
-
public_send("#{digest_column}=", Digest::SHA256.hexdigest(value)) if respond_to?(digest_column)
|
63
|
+
attr_encrypt_digest(attribute, value)
|
47
64
|
end
|
48
65
|
|
49
66
|
public_send("#{keyring_column_name}=", keyring_id)
|
data/lib/attr_keyring/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attr_keyring
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: sqlite3
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|