secure_web_token 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d62f802df65f418dedc52fd9fe852f09c92cea0e74efe06c54597fd3fbe410dc
4
+ data.tar.gz: '08f76fb02c959b5cf49b7ff731dbf9ea7c237bd247e202d6d83cc2212ab0dd4f'
5
+ SHA512:
6
+ metadata.gz: df1633e508328bd2820e276eaf8cd2b39685a2a0ed95268142e6237de7372ff412446afdbba549dc29bf7700d9f9769184d3ea260fc2ed693351ba0da406e8a8
7
+ data.tar.gz: f48caa901014958d012747644a3eb99e7feb1906d2f75f698a5e11b7e8f2fb2e0f1f5992aef9c6d9c19da6b6b13e2e110befd1923ec74a8c660f19a61951a06d
@@ -0,0 +1,20 @@
1
+ Copyright 2018 Sampson Crowley
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,31 @@
1
+ # SecureWebToken
2
+ Generate, encrypt, and decrypt signed JSON web tokens using secure defaults for encryption
3
+
4
+ ## Usage
5
+ Coming Soon
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+ ```ruby
10
+ gem 'secure_web_token'
11
+ ```
12
+ And then execute:
13
+ ```bash
14
+ $ bundle
15
+ ```
16
+
17
+ Or add and install directly with bundler:
18
+ ```ruby
19
+ bundle add 'secure_web_token'
20
+ ```
21
+
22
+ Or install it directly with:
23
+ ```bash
24
+ $ gem install secure_web_token
25
+ ```
26
+
27
+ ## Contributing
28
+ Contribution directions go here.
29
+
30
+ ## License
31
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,128 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require 'jwt'
5
+ require 'jwe'
6
+
7
+ class SecureWebToken
8
+ CHARACTERS = [
9
+ *('a'..'z'),
10
+ *('A'..'Z'),
11
+ *(0..9).map(&:to_s),
12
+ *'!@#$%^&*()'.split('')
13
+ ].freeze
14
+
15
+ DEFAULT_OPTIONS = { enc: 'A256GCM', alg: 'dir', zip: 'DEF' }.freeze
16
+
17
+ class << self
18
+ def decode(payload, sig_key = nil, enc_key = nil)
19
+ sig_key ||= signing_key
20
+ enc_key ||= encryption_key
21
+ decrypted = ::JWE.decrypt(payload, enc_key)
22
+
23
+ ::JWT.decode(decrypted, sig_key, true, algorithm: 'HS512')[0]
24
+ end
25
+ alias_method :read, :decode
26
+ alias_method :decrypt, :decode
27
+ alias_method :deflate, :decode
28
+
29
+ def default_encryption_key
30
+ if defined?(@default_enc_key) && is_present?(@default_enc_key)
31
+ if @default_enc_key.respond_to? :call then
32
+ get_presence(@default_enc_key.call) || gen_encryption_key
33
+ else
34
+ @default_enc_key
35
+ end
36
+ else
37
+ gen_encryption_key
38
+ end
39
+ end
40
+
41
+ def default_encryption_key=(value_or_callable)
42
+ @default_enc_key = value_or_callable
43
+ end
44
+
45
+ def default_signing_key
46
+ if defined?(@default_sig_key) && is_present?(@default_sig_key)
47
+ if @default_sig_key.respond_to? :call then
48
+ get_presence(@default_sig_key.call) || gen_signing_key
49
+ else
50
+ @default_sig_key
51
+ end
52
+ else
53
+ gen_signing_key
54
+ end
55
+ end
56
+
57
+ def default_signing_key=(value_or_callable)
58
+ @default_sig_key = value_or_callable
59
+ end
60
+
61
+ def encode(payload, sig_key = nil, enc_key = nil, options = nil)
62
+ sig_key ||= signing_key
63
+ enc_key ||= encryption_key
64
+ options ||= encrypt_options
65
+ encoded = ::JWT.encode(payload, sig_key, 'HS512')
66
+
67
+ ::JWE.encrypt(encoded, enc_key, **options)
68
+ end
69
+ alias_method :create, :encode
70
+ alias_method :encrypt, :encode
71
+ alias_method :inflate, :encode
72
+
73
+ def encrypt_options
74
+ @encrypt_options ||= DEFAULT_OPTIONS
75
+ end
76
+
77
+ def encrypt_options=(options)
78
+ @encrypt_options = (options || DEFAULT_OPTIONS)
79
+ end
80
+
81
+ def encryption_key
82
+ @encryption_key ||= default_encryption_key
83
+ end
84
+
85
+ def encryption_key=(key)
86
+ @encryption_key = (key || gen_encryption_key)
87
+ end
88
+
89
+ def gen_encryption_key
90
+ SecureRandom.random_bytes(32)
91
+ end
92
+
93
+ def gen_signing_key(length = 50)
94
+ (0...length).map { CHARACTERS[rand(CHARACTERS.length)] }.join
95
+ end
96
+
97
+ def signing_key
98
+ @signing_key ||= default_signing_key
99
+ end
100
+
101
+ def signing_key=(key)
102
+ @signing_key = (key || gen_signing_key)
103
+ end
104
+
105
+ private
106
+ def is_blank?(object)
107
+ object.respond_to?(:blank?) ?
108
+ object.blank? :
109
+ is_empty?(object)
110
+ end
111
+
112
+ def is_empty?(object)
113
+ object.respond_to?(:empty?) ? !!object.empty? : !object
114
+ end
115
+
116
+ def is_present?(object)
117
+ object.respond_to?(:present?) ? object.present? : !blank?(object)
118
+ end
119
+
120
+ def get_presence(object)
121
+ if object.respond_to?(:presence)
122
+ object.presence
123
+ elsif is_present?(object)
124
+ object
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,3 @@
1
+ class SecureWebToken
2
+ VERSION = '0.1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: secure_web_token
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sampson Crowley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: zeitwerk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jwt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: jwe
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.4'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '6.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '6.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.1'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-reporters
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '13.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '13.0'
111
+ description: Generate, encrypt, and decrypt signed JSON web tokens
112
+ email:
113
+ - sampsonsprojects@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - MIT-LICENSE
119
+ - README.md
120
+ - lib/secure_web_token.rb
121
+ - lib/secure_web_token/version.rb
122
+ homepage: https://github.com/SampsonCrowley/secure_web_token
123
+ licenses:
124
+ - MIT
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubygems_version: 3.1.2
142
+ signing_key:
143
+ specification_version: 4
144
+ summary: Secure defaults for encrypted JWTs
145
+ test_files: []