confidential_info_manager 0.1.0 → 0.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
2
  SHA1:
3
- metadata.gz: 0d02a1d0294bde9a9ed276dd49e7b561a5256395
4
- data.tar.gz: d54df83c7d3a4e317d3f7f1e172716a538264c6d
3
+ metadata.gz: 6d1b530c264f77561de2998da5efe01820d087ca
4
+ data.tar.gz: f82d77b1986ea565ff47d091db6f90004cd1f7bb
5
5
  SHA512:
6
- metadata.gz: 351a0cb3ccc9689f57d91024207311643eeb313e09f2f6d5ebcfe24140cd06be9139f8097bdfbff2ab9cf594734832aeb7a278c207d55b7213b0597049ebe2bb
7
- data.tar.gz: ae23ce2f57899dac91ebf6956eef2e57f8182aef34ce6137d8c3740b2227c94541234087e94dcd20b6108bee6fb22e34408a7e240aa263c2aac354ba40e6f103
6
+ metadata.gz: b65ea88fe6d3e9bde78a25ef1725b6f0eafe56cd41bd8fc274cbb131e3bc1acc340660a80fde532641df7424577a8804ee02ac2018caac2460e192c0dd355278
7
+ data.tar.gz: d3f5a13bfece63e188ce4b493bf3c2bb69dcac005c35119b86fcb5b99b431bf70bcb1206b85ce2d8d00c3bd240cc78360952face052d679b30d617cb7e39fad9
data/.gitignore CHANGED
@@ -7,3 +7,6 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ .ruby-version
11
+ .rbenv-gemsets
12
+ *.swp
data/.travis.yml CHANGED
@@ -1,4 +1,15 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.2
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.5
6
+ - 2.2.2
7
+ - 2.2.3
8
+ notifications:
9
+ slack:
10
+ secure: NbFo5KxFajRvNkbUU+PyA+pj3BiUDBJo5JXbn0PzEkzSXZ5XO/EbWP/VE9I3V7XlTNyAtkUmy6bHM40qOKqjH/pybmtTGR0hD7DbE2qEVKU4o0+6eFM0Qu6d+ws/gnJFsoAorVQmCazzsCchCINVGGExVJ17sXrEIRNFVN/G2SX7HkirChE6kgkNX1+BhMV0eWhI1nAFpJE7x2wSVRo7VutgQ0ArOktR6PP1OlI3xWNq7WXRFYdlho4zZir/9dETwwioib0OanmMYyZpymnPmNp2gTjhtUaCGtZJzfcTYZ4Wqj19l/O/pAVsdnYeydJC9J9n2RDxxffbcfcJ66hVOLhVGehtQsAkV9LESlwm2PtUmo+iC9SnSarFV9725ilkfFYv07Ob0lz1byKprRjrvftB3jce6EMVKBMEkz7g83tEGtzEu8590mL2lhLhjfGn+3JA4Kty8O39qA1ptCdMEq/mVPiNaQjXIbJO5PNy36UutusT3KdScF6VfHnn1tURdRYttBF6dY9qIzCui0veQaxCAJbQxIC49Q80Dg9ZHtvi/mHJoVXC8oxEUpr8sjpJvbklfqexDpeuXTVq3yCOGF1Wb5VA2DQSS+aDVU3AxvnlUgurQZ7XVovHbq+d0C20V5ihPfjHJWL4T26LYM2hdaxBB2t6YJ+Nt8WRSugFKdU=
4
11
  before_install: gem install bundler -v 1.10.4
12
+ script: bundle exec rspec
13
+ branches:
14
+ only:
15
+ - master
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in confidential_info_manager.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ gem 'coveralls', :require => false
8
+ end
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # ConfidentialInfoManager
2
+ [![Build Status](https://travis-ci.org/tatsu07/confidential_info_manager.svg?branch=master)](https://travis-ci.org/tatsu07/confidential_info_manager)
3
+ [![Coverage Status](https://coveralls.io/repos/tatsu07/confidential_info_manager/badge.svg?branch=master&service=github)](https://coveralls.io/github/tatsu07/confidential_info_manager?branch=master)
2
4
 
3
5
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/confidential_info_manager`. To experiment with that code, run `bin/console` for an interactive prompt.
4
6
 
5
- TODO: Delete this and the text above, and describe your gem
6
-
7
7
  ## Installation
8
8
 
9
9
  Add this line to your application's Gemfile:
@@ -22,20 +22,40 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
+ Please the password and the salt used in the encrypter and decrypter passing the same thing at the time of instance generation
26
+
25
27
  ### Use as an object
26
28
 
27
29
  ```ruby
28
30
  require "confidential_info_manager"
29
31
 
30
32
  raw_data = "string"
33
+ # salt is no problem even if arbitrarily created
34
+ salt = ConfidentialInfoManager::Core.generate_salt
31
35
 
32
- manager = ConfidentialInfoManager::Core.new("password")
36
+ manager = ConfidentialInfoManager::Core.new("password", salt)
33
37
  # encrypt
34
38
  encrypt_data = manager.encrypt(raw_data)
35
39
  # decrypt
36
40
  decrypt_data = manager.decrypt(encrypt_data, String)
37
41
  ```
38
42
 
43
+ ### Save to YAML, load to YAML
44
+
45
+ ```ruby
46
+ require "confidential_info_manager"
47
+
48
+ password = "password"
49
+ salt = ConfidentialInfoManager::Core.generate_salt
50
+ file_path = "/tmp"
51
+ secret_data = { API_KEY: "abcedefg", API_SECRET_KEY: "abcedfg" }
52
+
53
+ confidential_info_manager = ConfidentialInfoManager::YAML.new(pass, salt)
54
+ confidential_info_manager.save(secret_data, file_path)
55
+ yaml_data = confidential_info_manager.load(file_path)
56
+
57
+ ```
58
+
39
59
  ## Development
40
60
 
41
61
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -23,6 +23,4 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
24
  spec.add_development_dependency "rspec"
25
25
  spec.add_development_dependency "yard"
26
- spec.add_development_dependency "yaml"
27
- spec.add_development_dependency "json"
28
26
  end
@@ -2,8 +2,11 @@
2
2
 
3
3
  require "openssl"
4
4
  require "json"
5
+ require "yaml"
6
+ require "base64"
5
7
  require "confidential_info_manager/version"
6
8
  require "confidential_info_manager/core"
9
+ require "confidential_info_manager/yaml"
7
10
 
8
11
  module ConfidentialInfoManager
9
12
  end
@@ -13,12 +13,21 @@ module ConfidentialInfoManager
13
13
  ##
14
14
  # constructor
15
15
  # @param [String] password
16
+ # @param [String] salt
16
17
  # @param [String] mode
17
- # @see OpenSSL::Ciper.ciphers
18
- def initialize(password, mode="AES-256-CBC")
18
+ # @see http://docs.ruby-lang.org/en/2.2.0/OpenSSL/Cipher.html
19
+ def initialize(password, salt, mode="AES-256-CBC")
19
20
  generate_encrypter(mode)
20
21
  generate_decrypter(mode)
21
- set_key_and_iv(password)
22
+ set_key_and_iv(password, salt)
23
+ end
24
+
25
+ ##
26
+ # generate salt
27
+ # @param [Integer] length
28
+ # @return [String] salt
29
+ def self.generate_salt(length = RANDOM_BYTES)
30
+ OpenSSL::Random.random_bytes(length)
22
31
  end
23
32
 
24
33
  ##
@@ -34,9 +43,12 @@ module ConfidentialInfoManager
34
43
  secret_data = Marshal.dump(secret_data)
35
44
  end
36
45
 
46
+ @@encrypter.reset
47
+
37
48
  encrypted_data = ""
38
49
  encrypted_data << @@encrypter.update(secret_data)
39
50
  encrypted_data << @@encrypter.final
51
+ Base64.strict_encode64(encrypted_data)
40
52
  end
41
53
 
42
54
  ##
@@ -46,6 +58,9 @@ module ConfidentialInfoManager
46
58
  # @note String/Fixnum/Bignum/Float/Array/Hash
47
59
  # @return [Object] decrypted data
48
60
  def decrypt(encrypted_data, type=String)
61
+ @@decrypter.reset
62
+
63
+ encrypted_data = Base64.strict_decode64(encrypted_data)
49
64
  decrypted_data = ""
50
65
  decrypted_data << @@decrypter.update(encrypted_data)
51
66
  decrypted_data << @@decrypter.final
@@ -60,13 +75,47 @@ module ConfidentialInfoManager
60
75
  decrypted_data
61
76
  end
62
77
 
78
+ ##
79
+ # encrypt only value
80
+ # @param [Object] secret_data
81
+ # @note Object is allowed an Hash or Array
82
+ # @return [Object] encrypted data
83
+ # @note Array/Hash
84
+ def encrypt_only_value(secret_data)
85
+ case secret_data
86
+ when Hash
87
+ Hash[secret_data.map { |key, val| [key, encrypt(val)] }]
88
+ when Array
89
+ secret_data.map { |val| encrypt(val) }
90
+ else
91
+ encrypt(secret_data)
92
+ end
93
+ end
94
+
95
+ ##
96
+ # decrypt only value
97
+ # @param [Object] encrypted_data
98
+ # @note Object is allowed an Hash or Array
99
+ # @return [Object] decrypted data
100
+ # @note Array/Hash
101
+ def decrypt_only_value(encrypted_data)
102
+ case encrypted_data
103
+ when Hash
104
+ Hash[encrypted_data.map { |key, val| [key, decrypt(val)] }]
105
+ when Array
106
+ encrypted_data.map { |val| decrypt(val) }
107
+ else
108
+ decrypt(encrypted_data)
109
+ end
110
+ end
111
+
63
112
  private
64
113
 
65
114
  ##
66
115
  # setting key and iv
67
116
  # @param [String] password
68
- def set_key_and_iv(password)
69
- salt = OpenSSL::Random.random_bytes(RANDOM_BYTES)
117
+ # @param [String] salt
118
+ def set_key_and_iv(password, salt)
70
119
  # Generated from the password and salt the key and IV in accordance with PKCS#5
71
120
  key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(
72
121
  password, salt, ITERATOR_COUNT,
@@ -1,3 +1,3 @@
1
1
  module ConfidentialInfoManager
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+
3
+ module ConfidentialInfoManager
4
+
5
+ class YAML < Core
6
+
7
+ ##
8
+ # YAML file save
9
+ # @param [Object] secret_data
10
+ # @note Object is a String or Array or Hash
11
+ # @param [String] file_path
12
+ def save(secret_data, file_path)
13
+ File.open(file_path, "w") { |file| ::YAML.dump(encrypt_only_value(secret_data), file) }
14
+ end
15
+
16
+ ##
17
+ # YAML file load
18
+ # @param [String] file_path
19
+ # @return [Hash]
20
+ def load(file_path)
21
+ decrypt_only_value(::YAML.load(File.read(file_path)))
22
+ end
23
+
24
+ end
25
+
26
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: confidential_info_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tatsu07
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-12-23 00:00:00.000000000 Z
11
+ date: 2015-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,34 +66,6 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: yaml
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: json
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
69
  description: It provides the encryption and decryption of data . Also , save the encrypted
98
70
  data in JSON or YAML, you can you read .
99
71
  email:
@@ -116,6 +88,7 @@ files:
116
88
  - lib/confidential_info_manager.rb
117
89
  - lib/confidential_info_manager/core.rb
118
90
  - lib/confidential_info_manager/version.rb
91
+ - lib/confidential_info_manager/yaml.rb
119
92
  homepage: https://github.com/tatsu07/confidential_info_manager
120
93
  licenses:
121
94
  - MIT