passphrase_entropy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ class PassphraseEntropy
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,38 @@
1
+ require "zlib"
2
+
3
+ # Estimate the entropy of a passphrase. This is calculated as the number of bytes
4
+ # required to encode the passphrase on top of a Deflate stream of a preset
5
+ # dictionary.
6
+ #
7
+ class PassphraseEntropy
8
+
9
+ # Instantiate a new PasswordEntropy calculator.
10
+ # dictionary should be a String containing a list of words; this is
11
+ # /usr/share/dict/words by default, which should be good for English systems.
12
+ #
13
+ def initialize(dictionary=default_dictionary)
14
+ @dictionary = dictionary
15
+ end
16
+
17
+ # Estimate the entropy of s (in bytes)
18
+ #
19
+ def entropy(s)
20
+ zlen(s) - baseline
21
+ end
22
+
23
+ private
24
+ def default_dictionary
25
+ File.read("/usr/share/dict/words")
26
+ end
27
+
28
+ def zlen(s)
29
+ z = Zlib::Deflate.new
30
+ out = z.deflate(@dictionary + s, Zlib::FINISH)
31
+ z.close
32
+ out.bytesize
33
+ end
34
+
35
+ def baseline
36
+ @baseline ||= zlen("")
37
+ end
38
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: UTF-8
2
+
3
+ require "minitest/autorun"
4
+ require "passphrase_entropy"
5
+
6
+ class PassphraseEntropyTest < MiniTest::Unit::TestCase
7
+
8
+ def setup
9
+ @passphrase_entropy = PassphraseEntropy.new
10
+ end
11
+
12
+ def assert_better(better, worse)
13
+ eb = @passphrase_entropy.entropy(better)
14
+ ew = @passphrase_entropy.entropy(worse)
15
+ assert(eb > ew, "Expected #{better} (#{eb}) to be better than #{worse} (#{ew})")
16
+ end
17
+
18
+ def test_adding_punctuation_should_improve_entropy
19
+ assert_better "rubbish!", "rubbish"
20
+ end
21
+
22
+ def test_random_letters_should_be_better_than_words
23
+ assert_better "sdfjhweu", "password"
24
+ end
25
+
26
+ def test_capital_letters_and_numbers_should_improve_entropy
27
+ assert_better "Password1", "password"
28
+ end
29
+
30
+ def test_complex_passwords_should_be_better_than_simple_ones
31
+ assert_better "Slightly^better 1", "Password1"
32
+ end
33
+
34
+ def test_should_agree_with_xkcd_936
35
+ assert_better "correct horse battery staple", "Tr0ub4dor&3"
36
+ end
37
+
38
+ def test_mixed_symbols_should_be_better_than_words
39
+ assert_better "~T3n Char$", "antidisestablishmentarianism"
40
+ end
41
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: passphrase_entropy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Paul Battley
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-17 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description:
15
+ email: pbattley@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/passphrase_entropy.rb
21
+ - lib/passphrase_entropy/version.rb
22
+ - test/passphrase_entropy_test.rb
23
+ homepage: https://github.com/alphagov/passphrase_entropy
24
+ licenses: []
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 1.8.11
44
+ signing_key:
45
+ specification_version: 3
46
+ summary: Estimate the entropy of a passphrase
47
+ test_files:
48
+ - test/passphrase_entropy_test.rb