slosilo 1.0.0 → 2.2.1
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.
- checksums.yaml +5 -5
- data/.dockerignore +2 -0
- data/.gitleaks.toml +221 -0
- data/CHANGELOG.md +11 -0
- data/CONTRIBUTING.md +16 -0
- data/Jenkinsfile +55 -0
- data/LICENSE +2 -2
- data/README.md +125 -8
- data/lib/slosilo.rb +1 -0
- data/lib/slosilo/adapters/sequel_adapter.rb +1 -1
- data/lib/slosilo/attr_encrypted.rb +29 -6
- data/lib/slosilo/errors.rb +3 -0
- data/lib/slosilo/jwt.rb +122 -0
- data/lib/slosilo/key.rb +86 -3
- data/lib/slosilo/keystore.rb +13 -2
- data/lib/slosilo/symmetric.rb +30 -9
- data/lib/slosilo/version.rb +1 -1
- data/publish-rubygem.sh +11 -0
- data/slosilo.gemspec +11 -3
- data/spec/encrypted_attributes_spec.rb +114 -0
- data/spec/file_adapter_spec.rb +10 -10
- data/spec/jwt_spec.rb +102 -0
- data/spec/key_spec.rb +120 -41
- data/spec/keystore_spec.rb +2 -2
- data/spec/random_spec.rb +12 -2
- data/spec/sequel_adapter_spec.rb +26 -30
- data/spec/slosilo_spec.rb +47 -15
- data/spec/spec_helper.rb +2 -20
- data/spec/symmetric_spec.rb +44 -22
- data/test.sh +25 -0
- metadata +36 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8723a6eff81a1e81b1e8f8a3b4998c202b4a36b042d2c3b33d830232f800e45e
|
4
|
+
data.tar.gz: 22abadf8b5edca4b2ad971be894e54a906e9b84f166098a95fbfa8cf8401a046
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 937190eaf606924682f14850313aeedf6b852f7cc0e88669451d6b0d147fcd61a485d4089ccdce35bb188fc057a750c82f01bd43118da104735efc264386caa7
|
7
|
+
data.tar.gz: 6e3b22a70e85c036932bb15b309e45d28d4b9f2eeaa59cdd2aa9f3db5b580b9d23e3844eaf71a59667acc99706b55e2100d1e4a1f6f0b70bafae117459babff3
|
data/.dockerignore
ADDED
data/.gitleaks.toml
ADDED
@@ -0,0 +1,221 @@
|
|
1
|
+
title = "Secretless Broker gitleaks config"
|
2
|
+
|
3
|
+
# This is the config file for gitleaks. You can configure gitleaks what to search for and what to whitelist.
|
4
|
+
# If GITLEAKS_CONFIG environment variable
|
5
|
+
# is set, gitleaks will load configurations from that path. If option --config-path is set, gitleaks will load
|
6
|
+
# configurations from that path. Gitleaks does not whitelist anything by default.
|
7
|
+
# - https://www.ndss-symposium.org/wp-content/uploads/2019/02/ndss2019_04B-3_Meli_paper.pdf
|
8
|
+
# - https://github.com/dxa4481/truffleHogRegexes/blob/master/truffleHogRegexes/regexes.json
|
9
|
+
[[rules]]
|
10
|
+
description = "AWS Client ID"
|
11
|
+
regex = '''(A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}'''
|
12
|
+
tags = ["key", "AWS"]
|
13
|
+
|
14
|
+
[[rules]]
|
15
|
+
description = "AWS Secret Key"
|
16
|
+
regex = '''(?i)aws(.{0,20})?(?-i)['\"][0-9a-zA-Z\/+]{40}['\"]'''
|
17
|
+
tags = ["key", "AWS"]
|
18
|
+
|
19
|
+
[[rules]]
|
20
|
+
description = "AWS MWS key"
|
21
|
+
regex = '''amzn\.mws\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'''
|
22
|
+
tags = ["key", "AWS", "MWS"]
|
23
|
+
|
24
|
+
[[rules]]
|
25
|
+
description = "PKCS8"
|
26
|
+
regex = '''-----BEGIN PRIVATE KEY-----'''
|
27
|
+
tags = ["key", "PKCS8"]
|
28
|
+
|
29
|
+
[[rules]]
|
30
|
+
description = "RSA"
|
31
|
+
regex = '''-----BEGIN RSA PRIVATE KEY-----'''
|
32
|
+
tags = ["key", "RSA"]
|
33
|
+
|
34
|
+
[[rules]]
|
35
|
+
description = "SSH"
|
36
|
+
regex = '''-----BEGIN OPENSSH PRIVATE KEY-----'''
|
37
|
+
tags = ["key", "SSH"]
|
38
|
+
|
39
|
+
[[rules]]
|
40
|
+
description = "PGP"
|
41
|
+
regex = '''-----BEGIN PGP PRIVATE KEY BLOCK-----'''
|
42
|
+
tags = ["key", "PGP"]
|
43
|
+
|
44
|
+
[[rules]]
|
45
|
+
description = "Facebook Secret Key"
|
46
|
+
regex = '''(?i)(facebook|fb)(.{0,20})?(?-i)['\"][0-9a-f]{32}['\"]'''
|
47
|
+
tags = ["key", "Facebook"]
|
48
|
+
|
49
|
+
[[rules]]
|
50
|
+
description = "Facebook Client ID"
|
51
|
+
regex = '''(?i)(facebook|fb)(.{0,20})?['\"][0-9]{13,17}['\"]'''
|
52
|
+
tags = ["key", "Facebook"]
|
53
|
+
|
54
|
+
[[rules]]
|
55
|
+
description = "Facebook access token"
|
56
|
+
regex = '''EAACEdEose0cBA[0-9A-Za-z]+'''
|
57
|
+
tags = ["key", "Facebook"]
|
58
|
+
|
59
|
+
[[rules]]
|
60
|
+
description = "Twitter Secret Key"
|
61
|
+
regex = '''(?i)twitter(.{0,20})?['\"][0-9a-z]{35,44}['\"]'''
|
62
|
+
tags = ["key", "Twitter"]
|
63
|
+
|
64
|
+
[[rules]]
|
65
|
+
description = "Twitter Client ID"
|
66
|
+
regex = '''(?i)twitter(.{0,20})?['\"][0-9a-z]{18,25}['\"]'''
|
67
|
+
tags = ["client", "Twitter"]
|
68
|
+
|
69
|
+
[[rules]]
|
70
|
+
description = "Github"
|
71
|
+
regex = '''(?i)github(.{0,20})?(?-i)['\"][0-9a-zA-Z]{35,40}['\"]'''
|
72
|
+
tags = ["key", "Github"]
|
73
|
+
|
74
|
+
[[rules]]
|
75
|
+
description = "LinkedIn Client ID"
|
76
|
+
regex = '''(?i)linkedin(.{0,20})?(?-i)['\"][0-9a-z]{12}['\"]'''
|
77
|
+
tags = ["client", "Twitter"]
|
78
|
+
|
79
|
+
[[rules]]
|
80
|
+
description = "LinkedIn Secret Key"
|
81
|
+
regex = '''(?i)linkedin(.{0,20})?['\"][0-9a-z]{16}['\"]'''
|
82
|
+
tags = ["secret", "Twitter"]
|
83
|
+
|
84
|
+
[[rules]]
|
85
|
+
description = "Slack"
|
86
|
+
regex = '''xox[baprs]-([0-9a-zA-Z]{10,48})?'''
|
87
|
+
tags = ["key", "Slack"]
|
88
|
+
|
89
|
+
[[rules]]
|
90
|
+
description = "EC"
|
91
|
+
regex = '''-----BEGIN EC PRIVATE KEY-----'''
|
92
|
+
tags = ["key", "EC"]
|
93
|
+
|
94
|
+
[[rules]]
|
95
|
+
description = "Generic API key"
|
96
|
+
regex = '''(?i)(api_key|apikey)(.{0,20})?['|"][0-9a-zA-Z]{32,45}['|"]'''
|
97
|
+
tags = ["key", "API", "generic"]
|
98
|
+
|
99
|
+
[[rules]]
|
100
|
+
description = "Generic Secret"
|
101
|
+
regex = '''(?i)secret(.{0,20})?['|"][0-9a-zA-Z]{32,45}['|"]'''
|
102
|
+
tags = ["key", "Secret", "generic"]
|
103
|
+
|
104
|
+
[[rules]]
|
105
|
+
description = "Google API key"
|
106
|
+
regex = '''AIza[0-9A-Za-z\\-_]{35}'''
|
107
|
+
tags = ["key", "Google"]
|
108
|
+
|
109
|
+
[[rules]]
|
110
|
+
description = "Google Cloud Platform API key"
|
111
|
+
regex = '''(?i)(google|gcp|youtube|drive|yt)(.{0,20})?['\"][AIza[0-9a-z\\-_]{35}]['\"]'''
|
112
|
+
tags = ["key", "Google", "GCP"]
|
113
|
+
|
114
|
+
[[rules]]
|
115
|
+
description = "Google OAuth"
|
116
|
+
regex = '''(?i)(google|gcp|auth)(.{0,20})?['"][0-9]+-[0-9a-z_]{32}\.apps\.googleusercontent\.com['"]'''
|
117
|
+
tags = ["key", "Google", "OAuth"]
|
118
|
+
|
119
|
+
[[rules]]
|
120
|
+
description = "Google OAuth access token"
|
121
|
+
regex = '''ya29\.[0-9A-Za-z\-_]+'''
|
122
|
+
tags = ["key", "Google", "OAuth"]
|
123
|
+
|
124
|
+
[[rules]]
|
125
|
+
description = "Heroku API key"
|
126
|
+
regex = '''(?i)heroku(.{0,20})?['"][0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}['"]'''
|
127
|
+
tags = ["key", "Heroku"]
|
128
|
+
|
129
|
+
[[rules]]
|
130
|
+
description = "MailChimp API key"
|
131
|
+
regex = '''(?i)(mailchimp|mc)(.{0,20})?['"][0-9a-f]{32}-us[0-9]{1,2}['"]'''
|
132
|
+
tags = ["key", "Mailchimp"]
|
133
|
+
|
134
|
+
[[rules]]
|
135
|
+
description = "Mailgun API key"
|
136
|
+
regex = '''(?i)(mailgun|mg)(.{0,20})?['"][0-9a-z]{32}['"]'''
|
137
|
+
tags = ["key", "Mailgun"]
|
138
|
+
|
139
|
+
[[rules]]
|
140
|
+
description = "Password in URL"
|
141
|
+
regex = '''[a-zA-Z]{3,10}:\/\/[^\/\s:@]{3,20}:[^\/\s:@]{3,20}@.{1,100}\/?.?'''
|
142
|
+
tags = ["key", "URL", "generic"]
|
143
|
+
|
144
|
+
[[rules]]
|
145
|
+
description = "PayPal Braintree access token"
|
146
|
+
regex = '''access_token\$production\$[0-9a-z]{16}\$[0-9a-f]{32}'''
|
147
|
+
tags = ["key", "Paypal"]
|
148
|
+
|
149
|
+
[[rules]]
|
150
|
+
description = "Picatic API key"
|
151
|
+
regex = '''sk_live_[0-9a-z]{32}'''
|
152
|
+
tags = ["key", "Picatic"]
|
153
|
+
|
154
|
+
[[rules]]
|
155
|
+
description = "Slack Webhook"
|
156
|
+
regex = '''https://hooks.slack.com/services/T[a-zA-Z0-9_]{8}/B[a-zA-Z0-9_]{8}/[a-zA-Z0-9_]{24}'''
|
157
|
+
tags = ["key", "slack"]
|
158
|
+
|
159
|
+
[[rules]]
|
160
|
+
description = "Stripe API key"
|
161
|
+
regex = '''(?i)stripe(.{0,20})?['\"][sk|rk]_live_[0-9a-zA-Z]{24}'''
|
162
|
+
tags = ["key", "Stripe"]
|
163
|
+
|
164
|
+
[[rules]]
|
165
|
+
description = "Square access token"
|
166
|
+
regex = '''sq0atp-[0-9A-Za-z\-_]{22}'''
|
167
|
+
tags = ["key", "square"]
|
168
|
+
|
169
|
+
[[rules]]
|
170
|
+
description = "Square OAuth secret"
|
171
|
+
regex = '''sq0csp-[0-9A-Za-z\\-_]{43}'''
|
172
|
+
tags = ["key", "square"]
|
173
|
+
|
174
|
+
[[rules]]
|
175
|
+
description = "Twilio API key"
|
176
|
+
regex = '''(?i)twilio(.{0,20})?['\"][0-9a-f]{32}['\"]'''
|
177
|
+
tags = ["key", "twilio"]
|
178
|
+
|
179
|
+
[whitelist]
|
180
|
+
files = [
|
181
|
+
"(.*?)(jpg|gif|doc|pdf|bin)$",
|
182
|
+
".gitleaks.toml"
|
183
|
+
]
|
184
|
+
regexes = [
|
185
|
+
]
|
186
|
+
commits = [
|
187
|
+
"3a496cef2d737f69038630f3c884a159f783bd06", # old commit to add test data
|
188
|
+
"047e58e40c87f9d19d68c21a533b706616ab1ef2", # old commit to add test data
|
189
|
+
"5345e49e7d63589fc637c2b0c7156bf97e9c72b8", # old commit to add test data
|
190
|
+
"9c31229cedceedd75e06c381fe7218571a03c26d" # old commit to add test data
|
191
|
+
]
|
192
|
+
|
193
|
+
# Additional Examples
|
194
|
+
|
195
|
+
# [[rules]]
|
196
|
+
# description = "Generic Key"
|
197
|
+
# regex = '''(?i)key(.{0,6})?(:|=|=>|:=)'''
|
198
|
+
# entropies = [
|
199
|
+
# "4.1-4.3",
|
200
|
+
# "5.5-6.3",
|
201
|
+
# ]
|
202
|
+
# entropyROI = "line"
|
203
|
+
# filetypes = [".go", ".py", ".c"]
|
204
|
+
# tags = ["key"]
|
205
|
+
# severity = "8"
|
206
|
+
#
|
207
|
+
#
|
208
|
+
# [[rules]]
|
209
|
+
# description = "Generic Key"
|
210
|
+
# regex = '''(?i)key(.{0,6})?(:|=|=>|:=)'''
|
211
|
+
# entropies = ["4.1-4.3"]
|
212
|
+
# filetypes = [".gee"]
|
213
|
+
# entropyROI = "line"
|
214
|
+
# tags = ["key"]
|
215
|
+
# severity = "medium"
|
216
|
+
|
217
|
+
# [[rules]]
|
218
|
+
# description = "Any pem file"
|
219
|
+
# filetypes = [".key"]
|
220
|
+
# tags = ["pem"]
|
221
|
+
# severity = "high"
|
data/CHANGELOG.md
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
For general contribution and community guidelines, please see the [community repo](https://github.com/cyberark/community).
|
4
|
+
|
5
|
+
## Contributing Workflow
|
6
|
+
|
7
|
+
1. [Fork the project](https://help.github.com/en/github/getting-started-with-github/fork-a-repo)
|
8
|
+
2. [Clone your fork](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository)
|
9
|
+
3. Make local changes to your fork by editing files
|
10
|
+
3. [Commit your changes](https://help.github.com/en/github/managing-files-in-a-repository/adding-a-file-to-a-repository-using-the-command-line)
|
11
|
+
4. [Push your local changes to the remote server](https://help.github.com/en/github/using-git/pushing-commits-to-a-remote-repository)
|
12
|
+
5. [Create new Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork)
|
13
|
+
|
14
|
+
From here your pull request will be reviewed and once you've responded to all
|
15
|
+
feedback it will be merged into the project. Congratulations, you're a
|
16
|
+
contributor!
|
data/Jenkinsfile
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env groovy
|
2
|
+
|
3
|
+
pipeline {
|
4
|
+
agent { label 'executor-v2' }
|
5
|
+
|
6
|
+
options {
|
7
|
+
timestamps()
|
8
|
+
buildDiscarder(logRotator(daysToKeepStr: '30'))
|
9
|
+
}
|
10
|
+
|
11
|
+
stages {
|
12
|
+
stage('Test') {
|
13
|
+
steps {
|
14
|
+
sh './test.sh'
|
15
|
+
|
16
|
+
junit 'spec/reports/*.xml'
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
stage('Publish to RubyGems') {
|
21
|
+
agent { label 'releaser-v2' }
|
22
|
+
when {
|
23
|
+
allOf {
|
24
|
+
branch 'master'
|
25
|
+
expression {
|
26
|
+
boolean publish = false
|
27
|
+
|
28
|
+
try {
|
29
|
+
timeout(time: 5, unit: 'MINUTES') {
|
30
|
+
input(message: 'Publish to RubyGems?')
|
31
|
+
publish = true
|
32
|
+
}
|
33
|
+
} catch (final ignore) {
|
34
|
+
publish = false
|
35
|
+
}
|
36
|
+
|
37
|
+
return publish
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
steps {
|
43
|
+
checkout scm
|
44
|
+
sh './publish-rubygem.sh'
|
45
|
+
deleteDir()
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
post {
|
51
|
+
always {
|
52
|
+
cleanupAndNotify(currentBuild.currentResult)
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
data/LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c)
|
1
|
+
Copyright (c) 2020 CyberArk Software Ltd. All rights reserved.
|
2
2
|
|
3
3
|
MIT License
|
4
4
|
|
@@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
19
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
20
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
21
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
# Slosilo
|
2
2
|
|
3
|
-
Slosilo is a
|
4
|
-
|
3
|
+
Slosilo is providing a ruby interface to some cryptographic primitives:
|
4
|
+
- symmetric encryption,
|
5
|
+
- a mixin for easy encryption of object attributes,
|
6
|
+
- asymmetric encryption and signing,
|
7
|
+
- a keystore in a postgres sequel db -- it allows easy storage and retrieval of keys,
|
8
|
+
- a keystore in files.
|
5
9
|
|
6
10
|
## Installation
|
7
11
|
|
@@ -13,6 +17,118 @@ And then execute:
|
|
13
17
|
|
14
18
|
$ bundle
|
15
19
|
|
20
|
+
## Compatibility
|
21
|
+
|
22
|
+
Version 2.0 introduced new symmetric encryption scheme using AES-256-GCM
|
23
|
+
for authenticated encryption. It allows you to provide AAD on all symmetric
|
24
|
+
encryption primitives. It's also **NOT COMPATIBLE** with CBC used in version <2.
|
25
|
+
|
26
|
+
This means you'll have to migrate all your existing data. There's no easy way to
|
27
|
+
do this currently provided; it's recommended to create a database migration and
|
28
|
+
put relevant code fragments in it directly. (This will also have the benefit of making
|
29
|
+
the migration self-contained.)
|
30
|
+
|
31
|
+
Since symmetric encryption is used in processing asymetrically encrypted messages,
|
32
|
+
this incompatibility extends to those too.
|
33
|
+
|
34
|
+
## Usage
|
35
|
+
|
36
|
+
### Symmetric encryption
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
sym = Slosilo::Symmetric.new
|
40
|
+
key = sym.random_key
|
41
|
+
# additional authenticated data
|
42
|
+
message_id = "message 001"
|
43
|
+
ciphertext = sym.encrypt "secret message", key: key, aad: message_id
|
44
|
+
```
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
sym = Slosilo::Symmetric.new
|
48
|
+
message = sym.decrypt ciphertext, key: key, aad: message_id
|
49
|
+
```
|
50
|
+
|
51
|
+
### Encryption mixin
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
require 'slosilo'
|
55
|
+
|
56
|
+
class Foo
|
57
|
+
attr_accessor :foo
|
58
|
+
attr_encrypted :foo, aad: :id
|
59
|
+
|
60
|
+
def raw_foo
|
61
|
+
@foo
|
62
|
+
end
|
63
|
+
|
64
|
+
def id
|
65
|
+
"unique record id"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
Slosilo::encryption_key = Slosilo::Symmetric.new.random_key
|
70
|
+
|
71
|
+
obj = Foo.new
|
72
|
+
obj.foo = "bar"
|
73
|
+
obj.raw_foo # => "\xC4\xEF\x87\xD3b\xEA\x12\xDF\xD0\xD4hk\xEDJ\v\x1Cr\xF2#\xA3\x11\xA4*k\xB7\x8F\x8F\xC2\xBD\xBB\xFF\xE3"
|
74
|
+
obj.foo # => "bar"
|
75
|
+
```
|
76
|
+
|
77
|
+
You can safely use it in ie. ActiveRecord::Base or Sequel::Model subclasses.
|
78
|
+
|
79
|
+
### Asymmetric encryption and signing
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
private_key = Slosilo::Key.new
|
83
|
+
public_key = private_key.public
|
84
|
+
```
|
85
|
+
|
86
|
+
#### Key dumping
|
87
|
+
```ruby
|
88
|
+
k = public_key.to_s # => "-----BEGIN PUBLIC KEY----- ...
|
89
|
+
(Slosilo::Key.new k) == public_key # => true
|
90
|
+
```
|
91
|
+
|
92
|
+
#### Encryption
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
encrypted = public_key.encrypt_message "eagle one sees many clouds"
|
96
|
+
# => "\xA3\x1A\xD2\xFC\xB0 ...
|
97
|
+
|
98
|
+
public_key.decrypt_message encrypted
|
99
|
+
# => OpenSSL::PKey::RSAError: private key needed.
|
100
|
+
|
101
|
+
private_key.decrypt_message encrypted
|
102
|
+
# => "eagle one sees many clouds"
|
103
|
+
```
|
104
|
+
|
105
|
+
#### Signing
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
token = private_key.signed_token "missile launch not authorized"
|
109
|
+
# => {"data"=>"missile launch not authorized", "timestamp"=>"2014-10-13 12:41:25 UTC", "signature"=>"bSImk...DzV3o", "key"=>"455f7ac42d2d483f750b4c380761821d"}
|
110
|
+
|
111
|
+
public_key.token_valid? token # => true
|
112
|
+
|
113
|
+
token["data"] = "missile launch authorized"
|
114
|
+
public_key.token_valid? token # => false
|
115
|
+
```
|
116
|
+
|
117
|
+
### Keystore
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
Slosilo::encryption_key = ENV['SLOSILO_KEY']
|
121
|
+
Slosilo.adapter = Slosilo::Adapters::FileAdapter.new "~/.keys"
|
122
|
+
|
123
|
+
Slosilo[:own] = Slosilo::Key.new
|
124
|
+
Slosilo[:their] = Slosilo::Key.new File.read("foo.pem")
|
125
|
+
|
126
|
+
msg = Slosilo[:their].encrypt_message 'bar'
|
127
|
+
p Slosilo[:own].signed_token msg
|
128
|
+
```
|
129
|
+
|
130
|
+
### Keystore in database
|
131
|
+
|
16
132
|
Add a migration to create the necessary table:
|
17
133
|
|
18
134
|
require 'slosilo/adapters/sequel_adapter/migration'
|
@@ -21,12 +137,13 @@ Remember to migrate your database
|
|
21
137
|
|
22
138
|
$ rake db:migrate
|
23
139
|
|
24
|
-
|
140
|
+
Then
|
141
|
+
```ruby
|
142
|
+
Slosilo.adapter = Slosilo::Adapters::SequelAdapter.new
|
143
|
+
```
|
25
144
|
|
26
145
|
## Contributing
|
27
146
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
32
|
-
5. Create new Pull Request
|
147
|
+
We welcome contributions of all kinds to this repository. For instructions on
|
148
|
+
how to get started and descriptions of our development workflows, please see our
|
149
|
+
[contributing guide](CONTRIBUTING.md).
|