ncypher 0.6.2 → 0.7.0
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/.travis.yml +1 -1
- data/README.md +18 -0
- data/exe/ncypher +24 -13
- data/lib/ncypher.rb +29 -14
- data/lib/ncypher/version.rb +1 -1
- data/ncypher.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5ae6bde2a016dfd99b8749cb7e4f323d68ff240bfc89155a514613de302b02d9
|
4
|
+
data.tar.gz: 0d5911bb280ee42d10f34050feb5ccfa6d03d2dce8cead6d1912981ed6ca33ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9b2cf4f291a6f56e36a1bff7a9b3adee281494835f93295092cbccffe2dacecaf656dbf0f9d0ba79a75bd055f232c41e3a51e5386aa8dd9fe768482bc42248f
|
7
|
+
data.tar.gz: 847d72ac2a8b21321a18c2eb4b6e49ee98ba6dd8dd7ac554ab25c0681c2ceff66f775064a1e573e11e97f8a12cea0112710b32400d6151786ee59b9c422dff17
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -68,7 +68,25 @@ defaults: &defaults
|
|
68
68
|
my_password: <%= Ncypher::Ncypher.decrypt('lXEwfKv4dEjmK0kojEAnikNsLCsVCtSMiR2aSfM6uUXYn2DzCZ3O7SA9HaGnMp/kEEsI') %>
|
69
69
|
```
|
70
70
|
|
71
|
+
## Password derived secret key
|
71
72
|
|
73
|
+
In some cases you may want to derive a key from a particular password you have memorized. You can simply do:
|
74
|
+
|
75
|
+
```
|
76
|
+
$> ncypher derive_key p4$$w0rd
|
77
|
+
R9RgHcFnuHr+86/7v3MdDyu3V63jh69VCPMXknA2v6E=
|
78
|
+
SALT: 4+d4JTGTxRbtXs1vYScBYg==
|
79
|
+
```
|
80
|
+
|
81
|
+
You can see that the salt is randomly generated for security reasons. You should put that salt in a `.ncypher_salt` file in the current directory (this file can be pushed to your repository). So that the next time you do `ncypher derive_key p4$$w0rd` you get the exact same ncyper\_key generated.
|
82
|
+
Note that the salt is written on STDERR so you can directly do:
|
83
|
+
|
84
|
+
```
|
85
|
+
$> ncypher derive_key p4$$w0rd > .ncypher_key
|
86
|
+
SALT: WKCAkJcS65nx3lA/w1BmBw==
|
87
|
+
```
|
88
|
+
|
89
|
+
Then you have the ncypher\_key in .ncypher\_key. Be sure to save the salt if you want to be able to derive back the exact same key in the future.
|
72
90
|
|
73
91
|
|
74
92
|
## Development
|
data/exe/ncypher
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require
|
2
|
+
require "ncypher"
|
3
3
|
|
4
4
|
begin
|
5
|
-
Object.const_get(
|
5
|
+
Object.const_get("Ncypher")
|
6
6
|
rescue NameError
|
7
|
-
require
|
7
|
+
require "bundler/setup"
|
8
8
|
end
|
9
9
|
|
10
10
|
SUB_COMMANDS = %w(generate_key encrypt decrypt)
|
@@ -12,6 +12,7 @@ SUB_COMMANDS = %w(generate_key encrypt decrypt)
|
|
12
12
|
if ARGV.empty?
|
13
13
|
STDERR.puts "Ncypher a credential encryption tool"
|
14
14
|
STDERR.puts "usage: ncypher generate_key"
|
15
|
+
STDERR.puts "usage: ncypher derive_key <password> [salt]"
|
15
16
|
STDERR.puts "usage: ncypher key"
|
16
17
|
STDERR.puts "usage: ncypher encrypt <text>"
|
17
18
|
STDERR.puts "usage: ncypher decrypt <text>"
|
@@ -20,14 +21,24 @@ end
|
|
20
21
|
|
21
22
|
cmd = ARGV.shift
|
22
23
|
case cmd
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
24
|
+
when "generate_key"
|
25
|
+
puts Ncypher::Ncypher.new.generate_key
|
26
|
+
when "derive_key"
|
27
|
+
password = ARGV.shift
|
28
|
+
unless password
|
29
|
+
abort "ncypher derive_key <password> [salt]"
|
30
|
+
end
|
31
|
+
salt = File.exists?(".ncypher_salt") ? File.read(".ncypher_salt")&.strip : ARGV.shift
|
32
|
+
key, used_salt = Ncypher::Ncypher.new.derive_key(password.strip, salt)
|
33
|
+
STDOUT.puts key
|
34
|
+
STDERR.puts "SALT: #{used_salt}" # Put salt on stderr so we can do ncypher deriver_key password > .ncypher_key
|
35
|
+
# and keep salt out of .ncypher_key
|
36
|
+
when "key"
|
37
|
+
puts Ncypher::Ncypher.new.key_b64
|
38
|
+
when "encrypt"
|
39
|
+
text = (ARGV.shift || STDIN.read)
|
40
|
+
puts Ncypher::Ncypher.new.encrypt(text.strip)
|
41
|
+
when "decrypt"
|
42
|
+
text = (ARGV.shift || STDIN.read)
|
43
|
+
puts Ncypher::Ncypher.new.decrypt(text.strip)
|
33
44
|
end
|
data/lib/ncypher.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require "ncypher/version"
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "base64"
|
4
|
+
require "rbnacl/libsodium"
|
5
|
+
require "rbnacl/password_hash"
|
6
6
|
|
7
|
-
|
7
|
+
require "rbnacl"
|
8
8
|
|
9
|
+
module Ncypher
|
9
10
|
class Ncypher
|
10
|
-
|
11
|
-
def initialize(key_filename: '.ncypher_key', key: nil)
|
11
|
+
def initialize(key_filename: ".ncypher_key", key: nil)
|
12
12
|
@key = key ? Base64.strict_decode64(key.strip) : nil
|
13
13
|
@key_filename = key_filename
|
14
14
|
end
|
@@ -26,12 +26,24 @@ module Ncypher
|
|
26
26
|
Base64.strict_encode64(generated_key)
|
27
27
|
end
|
28
28
|
|
29
|
+
def derive_key(password, encoded_salt = nil)
|
30
|
+
salt ||= encoded_salt ?
|
31
|
+
Base64.strict_decode64(encoded_salt) :
|
32
|
+
RbNaCl::Random.random_bytes(RbNaCl::PasswordHash::Argon2::SALTBYTES)
|
33
|
+
|
34
|
+
opslimit = 5
|
35
|
+
memlimit = 7_256_678
|
36
|
+
digest_size = RbNaCl::SecretBox.key_bytes
|
37
|
+
generated_key = RbNaCl::PasswordHash.argon2(password, salt, opslimit, memlimit, digest_size)
|
38
|
+
[Base64.strict_encode64(generated_key), Base64.strict_encode64(salt)]
|
39
|
+
end
|
40
|
+
|
29
41
|
def key
|
30
42
|
@key ||= begin
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
43
|
+
saved_key = ENV["NCYPHER_KEY"] || find_keyfile
|
44
|
+
abort "Can't find .ncypher_key file or NCYPHER_KEY env variable" if saved_key.nil?
|
45
|
+
Base64.strict_decode64(saved_key.strip)
|
46
|
+
end
|
35
47
|
end
|
36
48
|
|
37
49
|
def key_b64
|
@@ -50,6 +62,10 @@ module Ncypher
|
|
50
62
|
Ncypher.new.generate_key
|
51
63
|
end
|
52
64
|
|
65
|
+
def self.derive_key(password, salt = nil)
|
66
|
+
Ncypher.new.derive_key(password, salt)
|
67
|
+
end
|
68
|
+
|
53
69
|
def self.key
|
54
70
|
Ncypher.new.key
|
55
71
|
end
|
@@ -59,18 +75,17 @@ module Ncypher
|
|
59
75
|
end
|
60
76
|
|
61
77
|
private
|
78
|
+
|
62
79
|
def box
|
63
80
|
RbNaCl::SimpleBox.from_secret_key(key)
|
64
81
|
end
|
65
82
|
|
66
|
-
def find_keyfile(folder:
|
83
|
+
def find_keyfile(folder: ".")
|
67
84
|
path = "#{folder}/#{@key_filename}"
|
68
85
|
return File.read(path) if File.exist?(path)
|
69
|
-
return nil if folder ==
|
86
|
+
return nil if folder == "/"
|
70
87
|
folder = File.expand_path("#{folder}/../")
|
71
88
|
find_keyfile(folder: folder)
|
72
89
|
end
|
73
|
-
|
74
90
|
end
|
75
|
-
|
76
91
|
end
|
data/lib/ncypher/version.rb
CHANGED
data/ncypher.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ncypher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Hagege
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '5.0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '5.0'
|
83
83
|
description: ''
|
84
84
|
email:
|
85
85
|
- david.hagege@gmail.com
|
@@ -121,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
121
|
version: '0'
|
122
122
|
requirements: []
|
123
123
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.
|
124
|
+
rubygems_version: 2.7.7
|
125
125
|
signing_key:
|
126
126
|
specification_version: 4
|
127
127
|
summary: Ncypher lets you encrypt/decrypt credentials in a safe and transparent way
|