dionysus 0.1.1 → 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.
- data/VERSION +1 -1
- data/dionysus.gemspec +10 -3
- data/lib/dionysus/configuration.rb +2 -0
- data/lib/dionysus/security.rb +1 -0
- data/lib/dionysus/security/string.rb +105 -0
- data/lib/dionysus/string.rb +30 -0
- data/spec/dionysus_spec.rb +1 -0
- data/spec/spec_helper.rb +0 -1
- data/spec/string_security_spec.rb +111 -0
- data/spec/string_spec.rb +26 -0
- metadata +10 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/dionysus.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dionysus}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Travis D. Warlick, Jr."]
|
@@ -25,10 +25,15 @@ Gem::Specification.new do |s|
|
|
25
25
|
"dionysus.gemspec",
|
26
26
|
"lib/dionysus.rb",
|
27
27
|
"lib/dionysus/configuration.rb",
|
28
|
+
"lib/dionysus/security.rb",
|
29
|
+
"lib/dionysus/security/string.rb",
|
30
|
+
"lib/dionysus/string.rb",
|
28
31
|
"spec/configuration_spec.rb",
|
29
32
|
"spec/dionysus_spec.rb",
|
30
33
|
"spec/spec.opts",
|
31
|
-
"spec/spec_helper.rb"
|
34
|
+
"spec/spec_helper.rb",
|
35
|
+
"spec/string_security_spec.rb",
|
36
|
+
"spec/string_spec.rb"
|
32
37
|
]
|
33
38
|
s.homepage = %q{http://github.com/tekwiz/dionysus}
|
34
39
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -38,7 +43,9 @@ Gem::Specification.new do |s|
|
|
38
43
|
s.test_files = [
|
39
44
|
"spec/configuration_spec.rb",
|
40
45
|
"spec/dionysus_spec.rb",
|
41
|
-
"spec/spec_helper.rb"
|
46
|
+
"spec/spec_helper.rb",
|
47
|
+
"spec/string_security_spec.rb",
|
48
|
+
"spec/string_spec.rb"
|
42
49
|
]
|
43
50
|
|
44
51
|
if s.respond_to? :specification_version then
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'dionysus/security/string'
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
require 'digest/sha2'
|
3
|
+
require 'digest/md5'
|
4
|
+
|
5
|
+
require 'dionysus'
|
6
|
+
require 'dionysus/string'
|
7
|
+
##
|
8
|
+
# Adds String hashing and salting convenience methods.
|
9
|
+
#
|
10
|
+
# require 'dionysus/security/string'
|
11
|
+
class String
|
12
|
+
##
|
13
|
+
# Generate a random, binary salt with the given length (default 16)
|
14
|
+
def self.salt( length = 16 )
|
15
|
+
length.times.to_a.collect {|v| rand(255).chr}.join[0...length]
|
16
|
+
end
|
17
|
+
|
18
|
+
##
|
19
|
+
# Generate the SHA 512 HASh, with the given salt appended
|
20
|
+
#
|
21
|
+
# Options:
|
22
|
+
# [salt] Salt to append to the string.
|
23
|
+
# Default: ''
|
24
|
+
# [encoding] Encoding for the hash: <tt>:binary</tt>, <tt>:hex</tt>, <tt>:hexidecimal</tt>, <tt>:base64</tt>
|
25
|
+
# Default: <tt>:base64</tt>
|
26
|
+
def sha512( options = {} )
|
27
|
+
d = Digest::SHA512.digest(_salted(options[:salt]))
|
28
|
+
_encode(d, options[:encoding] || :base64)
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Generate the SHA 256 HASh, with the given salt appended
|
33
|
+
#
|
34
|
+
# Options:
|
35
|
+
# [salt] Salt to append to the string.
|
36
|
+
# Default: ''
|
37
|
+
# [encoding] Encoding for the hash: <tt>:binary</tt>, <tt>:hex</tt>, <tt>:hexidecimal</tt>, <tt>:base64</tt>
|
38
|
+
# Default: <tt>:base64</tt>
|
39
|
+
def sha256( options = {} )
|
40
|
+
d = Digest::SHA256.digest(_salted(options[:salt]))
|
41
|
+
_encode(d, options[:encoding] || :base64)
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Generate the SHA 2 HASh, with the given salt appended
|
46
|
+
#
|
47
|
+
# Options:
|
48
|
+
# [salt] Salt to append to the string.
|
49
|
+
# Default: ''
|
50
|
+
# [encoding] Encoding for the hash: <tt>:binary</tt>, <tt>:hex</tt>, <tt>:hexidecimal</tt>, <tt>:base64</tt>
|
51
|
+
# Default: <tt>:base64</tt>
|
52
|
+
def sha2( options = {} )
|
53
|
+
d = Digest::SHA2.digest(_salted(options[:salt]))
|
54
|
+
_encode(d, options[:encoding] || :base64)
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Generate the SHA 1 hash, with the given salt appended
|
59
|
+
#
|
60
|
+
# Options:
|
61
|
+
# [salt] Salt to append to the string.
|
62
|
+
# Default: ''
|
63
|
+
# [encoding] Encoding for the hash: <tt>:binary</tt>, <tt>:hex</tt>, <tt>:hexidecimal</tt>, <tt>:base64</tt>
|
64
|
+
# Default: <tt>:base64</tt>
|
65
|
+
def sha1( options = {} )
|
66
|
+
d = Digest::SHA1.digest(_salted(options[:salt]))
|
67
|
+
_encode(d, options[:encoding] || :base64)
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# Generate the MD5 hash, with the given salt appended.
|
72
|
+
#
|
73
|
+
# Options:
|
74
|
+
# [salt] Salt to append to the string.
|
75
|
+
# Default: ''
|
76
|
+
# [encoding] Encoding for the hash: <tt>:binary</tt>, <tt>:hex</tt>, <tt>:hexidecimal</tt>, <tt>:base64</tt>
|
77
|
+
# Default: <tt>:base64</tt>
|
78
|
+
def md5( options = {} )
|
79
|
+
d = Digest::MD5.digest(_salted(options[:salt]))
|
80
|
+
_encode(d, options[:encoding] || :base64)
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
##
|
86
|
+
# Salt the string by appending it to the end.
|
87
|
+
def _salted( salt )
|
88
|
+
self + (salt || '')
|
89
|
+
end
|
90
|
+
|
91
|
+
##
|
92
|
+
# Encode the value to the given encoding
|
93
|
+
def _encode( value, encoding )
|
94
|
+
case encoding
|
95
|
+
when :binary
|
96
|
+
value
|
97
|
+
when :base64
|
98
|
+
value.encode64s
|
99
|
+
when :hex, :hexidecimal
|
100
|
+
value.encodeHex
|
101
|
+
else
|
102
|
+
raise ArgumentError, "Invalid encoding: #{encoding}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'dionysus'
|
2
|
+
require 'active_support/base64'
|
3
|
+
|
4
|
+
##
|
5
|
+
# Adds string encoding convenience methods.
|
6
|
+
#
|
7
|
+
# require 'dionysus/string'
|
8
|
+
class String
|
9
|
+
##
|
10
|
+
# Encode the Base64 (without newlines)
|
11
|
+
def encode64s() Base64.encode64s(self); end
|
12
|
+
|
13
|
+
##
|
14
|
+
# Encode to Base 64
|
15
|
+
def encode64() Base64.encode64(self); end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Decode from Base 64
|
19
|
+
def decode64() Base64.decode64(self); end
|
20
|
+
|
21
|
+
##
|
22
|
+
# Encode to hexidecimal
|
23
|
+
def encodeHexidecimal() self.unpack('H*').first; end
|
24
|
+
alias_method :encodeHex, :encodeHexidecimal
|
25
|
+
|
26
|
+
##
|
27
|
+
# Decode from hexidecimal
|
28
|
+
def decodeHexidecimal() [self].pack('H*'); end
|
29
|
+
alias_method :decodeHex, :decodeHexidecimal
|
30
|
+
end
|
data/spec/dionysus_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,111 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
require 'dionysus/security/string'
|
4
|
+
describe String do
|
5
|
+
it "should generate a salt 16 bytes long" do
|
6
|
+
String.salt.length.should == 16
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should generate a salt arbitrary nubmer of bytes long" do
|
10
|
+
String.salt(5).length.should == 5
|
11
|
+
String.salt(1).length.should == 1
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should calculate sha512 in base64" do
|
15
|
+
digest = "KHErTuI/5urCF3vi6yTDxvAHBydW1CN3zVfBWDP/ItbmgeVi5IFq47ew0hPHzyK3AuMDh+Z9MBBlf3/mACgVMQ=="
|
16
|
+
"abcde\240z405".sha512.should == digest
|
17
|
+
"abcde\240z405".sha512(:encoding => :base64).should == digest
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should calculate sha256/sha2 in base64" do
|
21
|
+
digest = "vGeWpAMcqj2XuE8P4FirA2oUt1S78c6puQk03EOdnQY="
|
22
|
+
"abcde\240z405".sha256.should == digest
|
23
|
+
"abcde\240z405".sha256(:encoding => :base64).should == digest
|
24
|
+
"abcde\240z405".sha2.should == digest
|
25
|
+
"abcde\240z405".sha2(:encoding => :base64).should == digest
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should calculate sha1 in base64" do
|
29
|
+
digest = "wxeCFXPVXePFcpwuFDjonyn1G/w="
|
30
|
+
"abcde\240z405".sha1.should == digest
|
31
|
+
"abcde\240z405".sha1(:encoding => :base64).should == digest
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should calculate md5 in base64" do
|
35
|
+
digest = "ThT0y7KbAinjLpuChqsRuQ=="
|
36
|
+
"abcde\240z405".md5.should == digest
|
37
|
+
"abcde\240z405".md5(:encoding => :base64).should == digest
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should calculate sha512 with a salt" do
|
41
|
+
salt = 'abcdefg'
|
42
|
+
digest = "oxoD5Mwq6ck4B1P2tfsrCQnNHzBYQRKOFGTj1T0EFPWeNuy1/YPtsKGiz2os9ljt0/OwXEt/l8LsK/ktbwEHbg=="
|
43
|
+
"abcde\240z405".sha512(:salt => salt).should == digest
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should calculate sha256/sha2 with a salt" do
|
47
|
+
salt = 'abcdefg'
|
48
|
+
digest = "fWzU2g2GFAS5EAgTS09djo2eDDQdNp1xSTdrRO7m9v4="
|
49
|
+
"abcde\240z405".sha256(:salt => salt).should == digest
|
50
|
+
"abcde\240z405".sha2(:salt => salt).should == digest
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should calculate sha1 with a salt" do
|
54
|
+
salt = 'abcdefg'
|
55
|
+
digest = "JFdwlGl341qtbqX6mPQbjs8d1/U="
|
56
|
+
"abcde\240z405".sha1(:salt => salt).should == digest
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should calculate md5 with a salt" do
|
60
|
+
salt = 'abcdefg'
|
61
|
+
digest = "m59029ys/bc2HpeuZqcQ3w=="
|
62
|
+
"abcde\240z405".md5(:salt => salt).should == digest
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should calculate sha512 in hex/hexidecimal" do
|
66
|
+
digest = "28712b4ee23fe6eac2177be2eb24c3c6f007072756d42377cd57c15833ff22d6e681e562e4816ae3b7b0d213c7cf22b702e30387e67d3010657f7fe600281531"
|
67
|
+
"abcde\240z405".sha512(:encoding => :hex).should == digest
|
68
|
+
"abcde\240z405".sha512(:encoding => :hexidecimal).should == digest
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should calculate sha256/sha2 in hex/hexidecimal" do
|
72
|
+
digest = "bc6796a4031caa3d97b84f0fe058ab036a14b754bbf1cea9b90934dc439d9d06"
|
73
|
+
"abcde\240z405".sha256(:encoding => :hex).should == digest
|
74
|
+
"abcde\240z405".sha2(:encoding => :hex).should == digest
|
75
|
+
"abcde\240z405".sha256(:encoding => :hexidecimal).should == digest
|
76
|
+
"abcde\240z405".sha2(:encoding => :hexidecimal).should == digest
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should calculate sha1 in hex/hexidecimal" do
|
80
|
+
digest = "c317821573d55de3c5729c2e1438e89f29f51bfc"
|
81
|
+
"abcde\240z405".sha1(:encoding => :hex).should == digest
|
82
|
+
"abcde\240z405".sha1(:encoding => :hexidecimal).should == digest
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should calculate md5 in hex/hexidecimal" do
|
86
|
+
digest = "4e14f4cbb29b0229e32e9b8286ab11b9"
|
87
|
+
"abcde\240z405".md5(:encoding => :hex).should == digest
|
88
|
+
"abcde\240z405".md5(:encoding => :hexidecimal).should == digest
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should calculate sha512 in binary" do
|
92
|
+
digest = "(q+N\342?\346\352\302\027{\342\353$\303\306\360\a\a'V\324#w\315W\301X3\377\"\326\346\201\345b\344\201j\343\267\260\322\023\307\317\"\267\002\343\003\207\346}0\020e\177\177\346\000(\0251"
|
93
|
+
"abcde\240z405".sha512(:encoding => :binary).should == digest
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should calculate sha256/sha2 in binary" do
|
97
|
+
digest = "\274g\226\244\003\034\252=\227\270O\017\340X\253\003j\024\267T\273\361\316\251\271\t4\334C\235\235\006"
|
98
|
+
"abcde\240z405".sha256(:encoding => :binary).should == digest
|
99
|
+
"abcde\240z405".sha2(:encoding => :binary).should == digest
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should calculate sha1 in binary" do
|
103
|
+
digest = "\303\027\202\025s\325]\343\305r\234.\0248\350\237)\365\e\374"
|
104
|
+
"abcde\240z405".sha1(:encoding => :binary).should == digest
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should calculate md5 in binary" do
|
108
|
+
digest = "N\024\364\313\262\233\002)\343.\233\202\206\253\021\271"
|
109
|
+
"abcde\240z405".md5(:encoding => :binary).should == digest
|
110
|
+
end
|
111
|
+
end
|
data/spec/string_spec.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
require 'dionysus/string'
|
4
|
+
describe String do
|
5
|
+
it "should encode64s" do
|
6
|
+
"abcde\240z405".encode64s.should == "YWJjZGWgejQwNQ=="
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should encode64" do
|
10
|
+
"abcde\240z405".encode64.should == "YWJjZGWgejQwNQ==\n"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should decode64" do
|
14
|
+
"YWJjZGWgejQwNQ==".decode64.should == "abcde\240z405"
|
15
|
+
"YWJjZGWgejQwNQ==\n".decode64.should == "abcde\240z405"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should encodeHex" do
|
19
|
+
"abcde\240z405".encodeHex.should == "6162636465a07a343035"
|
20
|
+
"abcde\240z405".encodeHexidecimal.should == "6162636465a07a343035"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should decodeHex" do
|
24
|
+
'6162636465a07a343035'.decodeHexidecimal.should == "abcde\240z405"
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Travis D. Warlick, Jr.
|
@@ -65,10 +65,15 @@ files:
|
|
65
65
|
- dionysus.gemspec
|
66
66
|
- lib/dionysus.rb
|
67
67
|
- lib/dionysus/configuration.rb
|
68
|
+
- lib/dionysus/security.rb
|
69
|
+
- lib/dionysus/security/string.rb
|
70
|
+
- lib/dionysus/string.rb
|
68
71
|
- spec/configuration_spec.rb
|
69
72
|
- spec/dionysus_spec.rb
|
70
73
|
- spec/spec.opts
|
71
74
|
- spec/spec_helper.rb
|
75
|
+
- spec/string_security_spec.rb
|
76
|
+
- spec/string_spec.rb
|
72
77
|
has_rdoc: true
|
73
78
|
homepage: http://github.com/tekwiz/dionysus
|
74
79
|
licenses: []
|
@@ -103,3 +108,5 @@ test_files:
|
|
103
108
|
- spec/configuration_spec.rb
|
104
109
|
- spec/dionysus_spec.rb
|
105
110
|
- spec/spec_helper.rb
|
111
|
+
- spec/string_security_spec.rb
|
112
|
+
- spec/string_spec.rb
|