Change entropy Strength to Time To Crack

See issue 78
This commit is contained in:
Ian Coleman
2017-06-17 09:34:50 +10:00
parent ee42e5f712
commit 20f459ce8f
3 changed files with 32 additions and 54 deletions
+2 -2
View File
@@ -165,8 +165,8 @@
<div class="col-sm-7"> <div class="col-sm-7">
<textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards" data-translate-placeholder></textarea> <textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards" data-translate-placeholder></textarea>
<div class="row"> <div class="row">
<label class="col-sm-3 control-label" data-translate>Strength</label> <label class="col-sm-3 control-label" data-translate><span class="more-info" data-translate-title title="Based on estimates from zxcvbn using Filtered Entropy">Time To Crack</span></label>
<div class="strength col-sm-3 form-control-static"></div> <div class="crack-time col-sm-3 form-control-static"></div>
<label class="col-sm-3 control-label" data-translate>Event Count</label> <label class="col-sm-3 control-label" data-translate>Event Count</label>
<div class="event-count col-sm-3 form-control-static"></div> <div class="event-count col-sm-3 form-control-static"></div>
</div> </div>
+6 -28
View File
@@ -30,7 +30,7 @@
DOM.entropy = $(".entropy"); DOM.entropy = $(".entropy");
DOM.entropyFiltered = DOM.entropyContainer.find(".filtered"); DOM.entropyFiltered = DOM.entropyContainer.find(".filtered");
DOM.entropyType = DOM.entropyContainer.find(".type"); DOM.entropyType = DOM.entropyContainer.find(".type");
DOM.entropyStrength = DOM.entropyContainer.find(".strength"); DOM.entropyCrackTime = DOM.entropyContainer.find(".crack-time");
DOM.entropyEventCount = DOM.entropyContainer.find(".event-count"); DOM.entropyEventCount = DOM.entropyContainer.find(".event-count");
DOM.entropyBits = DOM.entropyContainer.find(".bits"); DOM.entropyBits = DOM.entropyContainer.find(".bits");
DOM.entropyBitsPerEvent = DOM.entropyContainer.find(".bits-per-event"); DOM.entropyBitsPerEvent = DOM.entropyContainer.find(".bits-per-event");
@@ -915,7 +915,7 @@
} }
function clearEntropyFeedback() { function clearEntropyFeedback() {
DOM.entropyStrength.text("..."); DOM.entropyCrackTime.text("...");
DOM.entropyType.text(""); DOM.entropyType.text("");
DOM.entropyWordCount.text("0"); DOM.entropyWordCount.text("0");
DOM.entropyEventCount.text("0"); DOM.entropyEventCount.text("0");
@@ -927,37 +927,15 @@
function showEntropyFeedback(entropy) { function showEntropyFeedback(entropy) {
var numberOfBits = entropy.binaryStr.length; var numberOfBits = entropy.binaryStr.length;
var strength = "extremely weak"; var timeToCrack = "unknown";
if (numberOfBits >= 64) {
strength = "very weak";
}
if (numberOfBits >= 96) {
strength = "weak";
}
if (numberOfBits >= 128) {
strength = "strong";
}
if (numberOfBits >= 160) {
strength = "very strong";
}
if (numberOfBits >= 192) {
strength = "extremely strong";
}
// If time to crack is less than one day, and password is considered
// strong or better based on the number of bits, rename strength to
// 'easily cracked'.
try { try {
var z = zxcvbn(entropy.base.parts.join("")); var z = zxcvbn(entropy.base.parts.join(""));
var timeToCrack = z.crack_times_seconds.offline_fast_hashing_1e10_per_second; timeToCrack = z.crack_times_display.offline_fast_hashing_1e10_per_second;
if (timeToCrack < 86400 && entropy.binaryStr.length >= 128) {
strength = "easily cracked";
if (z.feedback.warning != "") { if (z.feedback.warning != "") {
strength = strength + " - " + z.feedback.warning; timeToCrack = timeToCrack + " - " + z.feedback.warning;
}; };
} }
}
catch (e) { catch (e) {
strength = "unknown";
console.log("Error detecting entropy strength with zxcvbn:"); console.log("Error detecting entropy strength with zxcvbn:");
console.log(e); console.log(e);
} }
@@ -966,7 +944,7 @@
var bitsPerEvent = entropy.bitsPerEvent.toFixed(2); var bitsPerEvent = entropy.bitsPerEvent.toFixed(2);
DOM.entropyFiltered.html(entropy.cleanHtml); DOM.entropyFiltered.html(entropy.cleanHtml);
DOM.entropyType.text(entropyTypeStr); DOM.entropyType.text(entropyTypeStr);
DOM.entropyStrength.text(strength); DOM.entropyCrackTime.text(timeToCrack);
DOM.entropyEventCount.text(entropy.base.ints.length); DOM.entropyEventCount.text(entropy.base.ints.length);
DOM.entropyBits.text(numberOfBits); DOM.entropyBits.text(numberOfBits);
DOM.entropyWordCount.text(wordCount); DOM.entropyWordCount.text(wordCount);
+22 -22
View File
@@ -2824,7 +2824,7 @@ page.open(url, function(status) {
events: 1, events: 1,
bits: 4, bits: 4,
words: 0, words: 0,
strength: "extremely weak", strength: "less than a second",
}, },
{ {
entropy: "AAAAAAAA", entropy: "AAAAAAAA",
@@ -2833,7 +2833,7 @@ page.open(url, function(status) {
events: 8, events: 8,
bits: 32, bits: 32,
words: 3, words: 3,
strength: "extremely weak", strength: "less than a second - Repeats like \"aaa\" are easy to guess",
}, },
{ {
entropy: "AAAAAAAA B", entropy: "AAAAAAAA B",
@@ -2842,7 +2842,7 @@ page.open(url, function(status) {
events: 9, events: 9,
bits: 36, bits: 36,
words: 3, words: 3,
strength: "extremely weak", strength: "less than a second - Repeats like \"aaa\" are easy to guess",
}, },
{ {
entropy: "AAAAAAAA BBBBBBBB", entropy: "AAAAAAAA BBBBBBBB",
@@ -2851,7 +2851,7 @@ page.open(url, function(status) {
events: 16, events: 16,
bits: 64, bits: 64,
words: 6, words: 6,
strength: "very weak", strength: "less than a second - Repeats like \"aaa\" are easy to guess",
}, },
{ {
entropy: "AAAAAAAA BBBBBBBB CCCCCCCC", entropy: "AAAAAAAA BBBBBBBB CCCCCCCC",
@@ -2860,7 +2860,7 @@ page.open(url, function(status) {
events: 24, events: 24,
bits: 96, bits: 96,
words: 9, words: 9,
strength: "weak", strength: "less than a second",
}, },
{ {
entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD", entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD",
@@ -2869,7 +2869,7 @@ page.open(url, function(status) {
events: 32, events: 32,
bits: 128, bits: 128,
words: 12, words: 12,
strength: "easily cracked", strength: "2 minutes",
}, },
{ {
entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA", entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA",
@@ -2878,7 +2878,7 @@ page.open(url, function(status) {
events: 32, events: 32,
bits: 128, bits: 128,
words: 12, words: 12,
strength: "strong", strength: "2 days",
}, },
{ {
entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE", entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE",
@@ -2887,7 +2887,7 @@ page.open(url, function(status) {
events: 40, events: 40,
bits: 160, bits: 160,
words: 15, words: 15,
strength: "very strong", strength: "3 years",
}, },
{ {
entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE FFFFFFFF", entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE FFFFFFFF",
@@ -2896,7 +2896,7 @@ page.open(url, function(status) {
events: 48, events: 48,
bits: 192, bits: 192,
words: 18, words: 18,
strength: "extremely strong", strength: "centuries",
}, },
{ {
entropy: "7d", entropy: "7d",
@@ -2904,7 +2904,7 @@ page.open(url, function(status) {
events: 1, events: 1,
bits: 5, bits: 5,
words: 0, words: 0,
strength: "extremely weak", strength: "less than a second",
}, },
{ {
entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
@@ -2912,7 +2912,7 @@ page.open(url, function(status) {
events: 52, events: 52,
bits: 225, bits: 225,
words: 21, words: 21,
strength: "extremely strong", strength: "centuries",
}, },
{ {
entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks3d", entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks3d",
@@ -2920,7 +2920,7 @@ page.open(url, function(status) {
events: 53, events: 53,
bits: 254, bits: 254,
words: 21, words: 21,
strength: "extremely strong", strength: "centuries",
}, },
{ {
entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d", entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d",
@@ -2928,7 +2928,7 @@ page.open(url, function(status) {
events: 53, events: 53,
bits: 254, bits: 254,
words: 21, words: 21,
strength: "extremely strong", strength: "centuries",
}, },
{ {
entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d5d6d", entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d5d6d",
@@ -2936,7 +2936,7 @@ page.open(url, function(status) {
events: 53, events: 53,
bits: 264, bits: 264,
words: 24, words: 24,
strength: "extremely strong", strength: "centuries",
}, },
// Next test was throwing uncaught error in zxcvbn // Next test was throwing uncaught error in zxcvbn
// Also tests 451 bits, ie Math.log2(52!)*2 = 225.58 * 2 // Also tests 451 bits, ie Math.log2(52!)*2 = 225.58 * 2
@@ -2946,7 +2946,7 @@ page.open(url, function(status) {
events: 104, events: 104,
bits: 499, bits: 499,
words: 45, words: 45,
strength: "extremely strong", strength: "centuries",
}, },
// Case insensitivity to duplicate cards // Case insensitivity to duplicate cards
{ {
@@ -2955,7 +2955,7 @@ page.open(url, function(status) {
events: 2, events: 2,
bits: 9, bits: 9,
words: 0, words: 0,
strength: "extremely weak", strength: "less than a second",
}, },
{ {
entropy: "ASas", entropy: "ASas",
@@ -2963,7 +2963,7 @@ page.open(url, function(status) {
events: 2, events: 2,
bits: 9, bits: 9,
words: 0, words: 0,
strength: "extremely weak", strength: "less than a second",
}, },
// Missing cards are detected // Missing cards are detected
{ {
@@ -2972,7 +2972,7 @@ page.open(url, function(status) {
events: 51, events: 51,
bits: 221, bits: 221,
words: 18, words: 18,
strength: "extremely strong", strength: "centuries",
}, },
{ {
entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
@@ -2980,7 +2980,7 @@ page.open(url, function(status) {
events: 50, events: 50,
bits: 216, bits: 216,
words: 18, words: 18,
strength: "extremely strong", strength: "centuries",
}, },
{ {
entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjd kdah2h3h 5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjd kdah2h3h 5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
@@ -2988,7 +2988,7 @@ page.open(url, function(status) {
events: 48, events: 48,
bits: 208, bits: 208,
words: 18, words: 18,
strength: "extremely strong", strength: "centuries",
}, },
// More than six missing cards does not show message // More than six missing cards does not show message
{ {
@@ -2997,7 +2997,7 @@ page.open(url, function(status) {
events: 45, events: 45,
bits: 195, bits: 195,
words: 18, words: 18,
strength: "extremely strong", strength: "centuries",
}, },
// Multiple decks of cards increases bits per event // Multiple decks of cards increases bits per event
{ {
@@ -3041,7 +3041,7 @@ page.open(url, function(status) {
events: 33, events: 33,
bits: 184, bits: 184,
bitsPerEvent: 5.59, bitsPerEvent: 5.59,
strength: 'easily cracked - Repeats like "abcabcabc" are only slightly harder to guess than "abc"', strength: 'less than a second - Repeats like "abcabcabc" are only slightly harder to guess than "abc"',
}, },
]; ];
// use entropy // use entropy