ncypher 0.6.1 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b65ff999987a0b7d414107d2910d0e00d5f206fd
4
- data.tar.gz: c82bced9cc0630a9700162fda252abe17922fee3
2
+ SHA256:
3
+ metadata.gz: 868bcb19ae0d6aea28005adc399f21ca2dd461663ff9cbaf8e7a3a767734052b
4
+ data.tar.gz: 830d632e5fc2f119e6768ae7e115c2cfccdac0fa017379241ef6397c418923d1
5
5
  SHA512:
6
- metadata.gz: 48e16e07449f59be41db2260df232003fd7d527dba43fca21972d8ed6716e4b7810813eb66a47c64b195820b90822f59351a304e90a3594510d2fec05fbf0b39
7
- data.tar.gz: 7bf1a6aa712ab2c6425d5b240dc9ac344f071ad3b86dd79c1be9de083a7dd3eae0e0c00eddb6b85fb911244181a46b884e23ab6a12ab893fc6618379946ff27c
6
+ metadata.gz: f8525b09eebde943e697c665c813ab6814eb867fddef0bd7f0e864c3aa0d293a7c55da4ba2557793246f23a70642fc7229a949be3b2514530670789358a0be11
7
+ data.tar.gz: ddff860755ae08603db392033d72583766e34efaa758f0044be4e0e0deab29afea9f669833dd2cc73f96c01029de8854aead7b576147a98cd1280cc2e0e70517
@@ -2,9 +2,11 @@ sudo: false
2
2
  cache:
3
3
  bundler: true
4
4
  language: ruby
5
- rvm:
6
- - 2.2.1
7
- before_install: gem install bundler -v 1.12.5
5
+ dist: bionic
6
+ before_install:
7
+ - gem install bundler -v 2.0
8
+ - sudo apt-get update -y
9
+ - sudo apt-get install -y libsodium23
8
10
  script: bundle exec rake
9
11
  deploy:
10
12
  provider: rubygems
data/README.md CHANGED
@@ -3,7 +3,15 @@
3
3
 
4
4
  # Ncypher
5
5
 
6
- Ncypher is a gem to help you to encrypt your credentials in your ruby apps in a safe manner.
6
+ Ncypher is a gem to help you to encrypt your credentials in your projects in a safe manner.
7
+
8
+ ## Upgrade from versions before 1.0
9
+ Versions before 1.0 were using rbnacl-libsodium gem which is now deprecated.
10
+ The big difference is that now you need to have libsodium installed on your host system.
11
+ That also means faster gem installation. =)
12
+ Check https://github.com/RubyCrypto/rbnacl/wiki/Installing-libsodium for more info.
13
+ Note: You need Argon2 support. So libsodium >= v1.0.15
14
+
7
15
 
8
16
  ## Installation
9
17
 
@@ -32,8 +40,8 @@ You can also set the env variable `NCYPHER_KEY` to that generated key (i.e `expo
32
40
 
33
41
  To encrypt a new password (or anything else), ncypher supports stdin. So you can do:
34
42
  ```
35
- $> cat secret_file | ncypher encrypt > secret_file.encrypted
36
- $> cat secret_file.encrypted | ncypher decrypt > secret_file
43
+ $> ncypher encrypt < secret_file > secret_file.encrypted
44
+ $> ncypher decrypt < secret_file.encrypted > secret_file
37
45
  $> ncypher encrypt
38
46
  mypassword
39
47
  <CTRL+D>
@@ -61,21 +69,39 @@ p4$$w0rd
61
69
 
62
70
  :)
63
71
 
64
- And Ncypher::Ncypher.decrypt will magically use your key in `.ncypher_key` to decrypt that password at runtime.
72
+ And if you are using ruby, Ncypher::Ncypher.decrypt will magically use your key in `.ncypher_key` to decrypt that password at runtime.
65
73
  Now you can directy put in your .yaml files:
66
74
  ```
67
75
  defaults: &defaults
68
76
  my_password: <%= Ncypher::Ncypher.decrypt('lXEwfKv4dEjmK0kojEAnikNsLCsVCtSMiR2aSfM6uUXYn2DzCZ3O7SA9HaGnMp/kEEsI') %>
69
77
  ```
70
78
 
79
+ ## Password derived secret key
80
+
81
+ In some cases you may want to derive a key from a particular password you have memorized. You can simply do:
82
+
83
+ ```
84
+ $> ncypher derive_key p4$$w0rd
85
+ R9RgHcFnuHr+86/7v3MdDyu3V63jh69VCPMXknA2v6E=
86
+ SALT: 4+d4JTGTxRbtXs1vYScBYg==
87
+ ```
71
88
 
89
+ 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.
90
+ Note that the salt is written on STDERR so you can directly do:
72
91
 
92
+ ```
93
+ $> ncypher derive_key p4$$w0rd > .ncypher_key
94
+ SALT: WKCAkJcS65nx3lA/w1BmBw==
95
+ ```
73
96
 
74
- ## Development
97
+ 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.
98
+ The derive_key command also listen to stdin so for safety you can instead do:
75
99
 
76
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
100
+ ```
101
+ $> ncypher derive_key > .ncypher_key
102
+ ```
77
103
 
78
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
104
+ And enter your password then CTRL+D.
79
105
 
80
106
  ## Contributing
81
107
 
@@ -1,17 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
- require 'ncypher'
2
+ require "ncypher"
3
3
 
4
4
  begin
5
- Object.const_get('Ncypher')
5
+ Object.const_get("Ncypher")
6
6
  rescue NameError
7
- require 'bundler/setup'
7
+ require "bundler/setup"
8
8
  end
9
9
 
10
- SUB_COMMANDS = %w(generate_key encrypt decrypt)
11
-
12
10
  if ARGV.empty?
13
11
  STDERR.puts "Ncypher a credential encryption tool"
14
12
  STDERR.puts "usage: ncypher generate_key"
13
+ STDERR.puts "usage: ncypher derive_key <password> [salt]"
15
14
  STDERR.puts "usage: ncypher key"
16
15
  STDERR.puts "usage: ncypher encrypt <text>"
17
16
  STDERR.puts "usage: ncypher decrypt <text>"
@@ -20,14 +19,24 @@ end
20
19
 
21
20
  cmd = ARGV.shift
22
21
  case cmd
23
- when "generate_key"
24
- puts Ncypher::Ncypher.new.generate_key
25
- when "key"
26
- puts Ncypher::Ncypher.new.key_b64
27
- when "encrypt"
28
- text = (ARGV.shift || STDIN.read)
29
- puts Ncypher::Ncypher.new.encrypt(text.strip)
30
- when "decrypt"
31
- text = (ARGV.shift || STDIN.read)
32
- puts Ncypher::Ncypher.new.decrypt(text.strip)
22
+ when "generate_key"
23
+ puts Ncypher::Ncypher.new.generate_key
24
+ when "derive_key"
25
+ password = (ARGV.shift || STDIN.read)
26
+ unless password
27
+ abort "ncypher derive_key <password> [salt]"
28
+ end
29
+ salt = File.exists?(".ncypher_salt") ? File.read(".ncypher_salt")&.strip : ARGV.shift
30
+ key, used_salt = Ncypher::Ncypher.new.derive_key(password.strip, salt)
31
+ STDOUT.puts key
32
+ STDERR.puts "SALT: #{used_salt}" # Put salt on stderr so we can do ncypher deriver_key password > .ncypher_key
33
+ # and keep salt out of .ncypher_key
34
+ when "key"
35
+ puts Ncypher::Ncypher.new.key_b64
36
+ when "encrypt"
37
+ text = (ARGV.shift || STDIN.read)
38
+ puts Ncypher::Ncypher.new.encrypt(text.strip)
39
+ when "decrypt"
40
+ text = (ARGV.shift || STDIN.read)
41
+ puts Ncypher::Ncypher.new.decrypt(text.strip)
33
42
  end
@@ -1,14 +1,13 @@
1
1
  require "ncypher/version"
2
2
 
3
- require 'base64'
4
- require 'rbnacl/libsodium'
5
- require 'rbnacl'
3
+ require "base64"
6
4
 
7
- module Ncypher
5
+ require "rbnacl"
8
6
 
7
+ module Ncypher
9
8
  class Ncypher
10
-
11
- def initialize(key_filename: '.ncypher_key')
9
+ def initialize(key_filename: ".ncypher_key", key: nil)
10
+ @key = key ? Base64.strict_decode64(key.strip) : nil
12
11
  @key_filename = key_filename
13
12
  end
14
13
 
@@ -21,14 +20,31 @@ module Ncypher
21
20
  end
22
21
 
23
22
  def generate_key
24
- generated_key = RbNaCl::Random.random_bytes(RbNaCl::SecretBox.key_bytes)
23
+ digest_size = 32 # RbNaCl::SecretBox.key_bytes
24
+ generated_key = RbNaCl::Random.random_bytes(digest_size)
25
25
  Base64.strict_encode64(generated_key)
26
26
  end
27
27
 
28
+ def derive_key(password, encoded_salt = nil)
29
+ salt_size = 16 # RbNaCl::PasswordHash::Argon2::SALTBYTES
30
+ salt ||= encoded_salt ?
31
+ Base64.strict_decode64(encoded_salt) :
32
+ RbNaCl::Random.random_bytes(salt_size)
33
+
34
+ opslimit = 5
35
+ memlimit = 7_256_678
36
+ digest_size = 32 # RbNaCl::SecretBox.key_bytes
37
+ generated_key = RbNaCl::PasswordHash::Argon2.new(opslimit, memlimit, digest_size)
38
+ .digest(password, salt, :argon2i)
39
+ [Base64.strict_encode64(generated_key), Base64.strict_encode64(salt)]
40
+ end
41
+
28
42
  def key
29
- saved_key = ENV['NCYPHER_KEY'] || find_keyfile
30
- abort "Can't find .ncypher_key file or NCYPHER_KEY env variable" if saved_key.nil?
31
- Base64.strict_decode64(saved_key.strip)
43
+ @key ||= begin
44
+ saved_key = ENV["NCYPHER_KEY"] || find_keyfile
45
+ abort "Can't find .ncypher_key file or NCYPHER_KEY env variable" if saved_key.nil?
46
+ Base64.strict_decode64(saved_key.strip)
47
+ end
32
48
  end
33
49
 
34
50
  def key_b64
@@ -47,6 +63,10 @@ module Ncypher
47
63
  Ncypher.new.generate_key
48
64
  end
49
65
 
66
+ def self.derive_key(password, salt = nil)
67
+ Ncypher.new.derive_key(password, salt)
68
+ end
69
+
50
70
  def self.key
51
71
  Ncypher.new.key
52
72
  end
@@ -56,18 +76,17 @@ module Ncypher
56
76
  end
57
77
 
58
78
  private
79
+
59
80
  def box
60
81
  RbNaCl::SimpleBox.from_secret_key(key)
61
82
  end
62
83
 
63
- def find_keyfile(folder: '.')
84
+ def find_keyfile(folder: ".")
64
85
  path = "#{folder}/#{@key_filename}"
65
86
  return File.read(path) if File.exist?(path)
66
- return nil if folder == '/'
87
+ return nil if folder == "/"
67
88
  folder = File.expand_path("#{folder}/../")
68
89
  find_keyfile(folder: folder)
69
90
  end
70
-
71
91
  end
72
-
73
92
  end
@@ -1,3 +1,3 @@
1
1
  module Ncypher
2
- VERSION = "0.6.1"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -19,10 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
  spec.license = 'WTFPL'
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1.12"
23
- spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "bundler", "~> 2.0"
23
+ spec.add_development_dependency "rake", "~> 12.3.3"
24
24
  spec.add_development_dependency "minitest", "~> 5.0"
25
25
 
26
- spec.add_dependency 'rbnacl-libsodium', '~> 1.0'
27
- spec.add_dependency 'rbnacl', '~> 3.0'
26
+ spec.add_dependency 'rbnacl', '~> 7.0'
28
27
  end
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.6.1
4
+ version: 1.2.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: 2017-03-24 00:00:00.000000000 Z
11
+ date: 2021-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.12'
19
+ version: '2.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.12'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 12.3.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 12.3.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,34 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
- - !ruby/object:Gem::Dependency
56
- name: rbnacl-libsodium
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.0'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: rbnacl
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '3.0'
61
+ version: '7.0'
76
62
  type: :runtime
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: '3.0'
68
+ version: '7.0'
83
69
  description: ''
84
70
  email:
85
71
  - david.hagege@gmail.com
@@ -120,8 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
106
  - !ruby/object:Gem::Version
121
107
  version: '0'
122
108
  requirements: []
123
- rubyforge_project:
124
- rubygems_version: 2.4.6
109
+ rubygems_version: 3.0.6
125
110
  signing_key:
126
111
  specification_version: 4
127
112
  summary: Ncypher lets you encrypt/decrypt credentials in a safe and transparent way