snipt

Ctrl+h for KB shortcuts

JavaScript

Guess how long it takes to crack a password

/**
 * For the purposes of this function, we're assuming that the password generated is 
 * composed from a list of words, joined by separators and has a number at the end. 
 * e.g.
 * Hello-World_Example!1
 * 
 * @param {number} words            - the total number of words in the dictionary words are chosen from
 * @param {number} wordCount        - the number of words chosen for a password
 * @param {number} separatorCount   - the number of different possible separators (can be *any* token
 * 									  that is valid for use in a password, a common set might be [email protected]#$%^&*)
 * @param {number} maxGuessesPerSec - the maximimum amount of guesses per second your attacker might 
 *                                    make against the resulting list
 * 
 * @returns {Object} - an object containing the days, years, and centuries required to go through the entire list 
 */
function guesser(words, wordCount, separatorCount, tailingNumberCount, maxGuessesPerSec) {
    // Formula:
    // (words * separatorCount) ^ wordCount) * tailingNumberCount
    // JS needs Math.pow() sadface 
    var possibilities = Math.pow((words * separatorCount), wordCount) * tailingNumberCount;
    var secondsToComplete = possibilities / maxGuessesPerSec;
    var days = secondsToComplete / 60 / 60 / 24; 
    return {
        days: Math.floor(days),
        years: Math.floor(days / 365),
        centuries: Math.floor(days / 365 / 100),
    };

}
// e.g. 2000 words in the dictionary, 4 words for the password, 5 possible separators, 10 possible numbers, 1000000 guesses per second
// guesser( 2000, 4, 5, 10, 1000000 );
// =>
// {
//     days: 1157407, 
//     years: 3170, 
//     centuries: 31
// }
guesser( 2000, 4, 5, 10, 1000000 );

Description

A function to guess how long it takes to guess a password based on some parameters
https://snipt.net/embed/d686b6a5243c46ceb6a84231c07bba9d/
/raw/d686b6a5243c46ceb6a84231c07bba9d/
d686b6a5243c46ceb6a84231c07bba9d
js
JavaScript
39
2019-08-18T21:12:48
True
False
False
Apr 12, 2016 at 10:01 PM
/api/public/snipt/145364/
guess-how-long-it-takes-to-crack-a-password
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><a href="#L-1"> 1</a> <a href="#L-2"> 2</a> <a href="#L-3"> 3</a> <a href="#L-4"> 4</a> <a href="#L-5"> 5</a> <a href="#L-6"> 6</a> <a href="#L-7"> 7</a> <a href="#L-8"> 8</a> <a href="#L-9"> 9</a> <a href="#L-10">10</a> <a href="#L-11">11</a> <a href="#L-12">12</a> <a href="#L-13">13</a> <a href="#L-14">14</a> <a href="#L-15">15</a> <a href="#L-16">16</a> <a href="#L-17">17</a> <a href="#L-18">18</a> <a href="#L-19">19</a> <a href="#L-20">20</a> <a href="#L-21">21</a> <a href="#L-22">22</a> <a href="#L-23">23</a> <a href="#L-24">24</a> <a href="#L-25">25</a> <a href="#L-26">26</a> <a href="#L-27">27</a> <a href="#L-28">28</a> <a href="#L-29">29</a> <a href="#L-30">30</a> <a href="#L-31">31</a> <a href="#L-32">32</a> <a href="#L-33">33</a> <a href="#L-34">34</a> <a href="#L-35">35</a> <a href="#L-36">36</a> <a href="#L-37">37</a> <a href="#L-38">38</a></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span id="L-1"><a name="L-1"></a><span class="cm">/**</span> </span><span id="L-2"><a name="L-2"></a><span class="cm"> * For the purposes of this function, we&#39;re assuming that the password generated is </span> </span><span id="L-3"><a name="L-3"></a><span class="cm"> * composed from a list of words, joined by separators and has a number at the end. </span> </span><span id="L-4"><a name="L-4"></a><span class="cm"> * e.g.</span> </span><span id="L-5"><a name="L-5"></a><span class="cm"> * Hello-World_Example!1</span> </span><span id="L-6"><a name="L-6"></a><span class="cm"> * </span> </span><span id="L-7"><a name="L-7"></a><span class="cm"> * @param {number} words - the total number of words in the dictionary words are chosen from</span> </span><span id="L-8"><a name="L-8"></a><span class="cm"> * @param {number} wordCount - the number of words chosen for a password</span> </span><span id="L-9"><a name="L-9"></a><span class="cm"> * @param {number} separatorCount - the number of different possible separators (can be *any* token</span> </span><span id="L-10"><a name="L-10"></a><span class="cm"> * that is valid for use in a password, a common set might be [email protected]#$%^&amp;*)</span> </span><span id="L-11"><a name="L-11"></a><span class="cm"> * @param {number} maxGuessesPerSec - the maximimum amount of guesses per second your attacker might </span> </span><span id="L-12"><a name="L-12"></a><span class="cm"> * make against the resulting list</span> </span><span id="L-13"><a name="L-13"></a><span class="cm"> * </span> </span><span id="L-14"><a name="L-14"></a><span class="cm"> * @returns {Object} - an object containing the days, years, and centuries required to go through the entire list </span> </span><span id="L-15"><a name="L-15"></a><span class="cm"> */</span> </span><span id="L-16"><a name="L-16"></a><span class="kd">function</span> <span class="nx">guesser</span><span class="p">(</span><span class="nx">words</span><span class="p">,</span> <span class="nx">wordCount</span><span class="p">,</span> <span class="nx">separatorCount</span><span class="p">,</span> <span class="nx">tailingNumberCount</span><span class="p">,</span> <span class="nx">maxGuessesPerSec</span><span class="p">)</span> <span class="p">{</span> </span><span id="L-17"><a name="L-17"></a> <span class="c1">// Formula:</span> </span><span id="L-18"><a name="L-18"></a> <span class="c1">// (words * separatorCount) ^ wordCount) * tailingNumberCount</span> </span><span id="L-19"><a name="L-19"></a> <span class="c1">// JS needs Math.pow() sadface </span> </span><span id="L-20"><a name="L-20"></a> <span class="kd">var</span> <span class="nx">possibilities</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">((</span><span class="nx">words</span> <span class="o">*</span> <span class="nx">separatorCount</span><span class="p">),</span> <span class="nx">wordCount</span><span class="p">)</span> <span class="o">*</span> <span class="nx">tailingNumberCount</span><span class="p">;</span> </span><span id="L-21"><a name="L-21"></a> <span class="kd">var</span> <span class="nx">secondsToComplete</span> <span class="o">=</span> <span class="nx">possibilities</span> <span class="o">/</span> <span class="nx">maxGuessesPerSec</span><span class="p">;</span> </span><span id="L-22"><a name="L-22"></a> <span class="kd">var</span> <span class="nx">days</span> <span class="o">=</span> <span class="nx">secondsToComplete</span> <span class="o">/</span> <span class="mi">60</span> <span class="o">/</span> <span class="mi">60</span> <span class="o">/</span> <span class="mi">24</span><span class="p">;</span> </span><span id="L-23"><a name="L-23"></a> <span class="k">return</span> <span class="p">{</span> </span><span id="L-24"><a name="L-24"></a> <span class="nx">days</span><span class="o">:</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nx">days</span><span class="p">),</span> </span><span id="L-25"><a name="L-25"></a> <span class="nx">years</span><span class="o">:</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nx">days</span> <span class="o">/</span> <span class="mi">365</span><span class="p">),</span> </span><span id="L-26"><a name="L-26"></a> <span class="nx">centuries</span><span class="o">:</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nx">days</span> <span class="o">/</span> <span class="mi">365</span> <span class="o">/</span> <span class="mi">100</span><span class="p">),</span> </span><span id="L-27"><a name="L-27"></a> <span class="p">};</span> </span><span id="L-28"><a name="L-28"></a> </span><span id="L-29"><a name="L-29"></a><span class="p">}</span> </span><span id="L-30"><a name="L-30"></a><span class="c1">// e.g. 2000 words in the dictionary, 4 words for the password, 5 possible separators, 10 possible numbers, 1000000 guesses per second</span> </span><span id="L-31"><a name="L-31"></a><span class="c1">// guesser( 2000, 4, 5, 10, 1000000 );</span> </span><span id="L-32"><a name="L-32"></a><span class="c1">// =&gt;</span> </span><span id="L-33"><a name="L-33"></a><span class="c1">// {</span> </span><span id="L-34"><a name="L-34"></a><span class="c1">// days: 1157407, </span> </span><span id="L-35"><a name="L-35"></a><span class="c1">// years: 3170, </span> </span><span id="L-36"><a name="L-36"></a><span class="c1">// centuries: 31</span> </span><span id="L-37"><a name="L-37"></a><span class="c1">// }</span> </span><span id="L-38"><a name="L-38"></a><span class="nx">guesser</span><span class="p">(</span> <span class="mi">2000</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">1000000</span> <span class="p">);</span> </span></pre></div> </td></tr></table>
javascript
--- 
+++ 
@@ -0,0 +1,38 @@
+/**
+ * For the purposes of this function, we're assuming that the password generated is 
+ * composed from a list of words, joined by separators and has a number at the end. 
+ * e.g.
+ * Hello-World_Example!1
+ * 
+ * @param {number} words            - the total number of words in the dictionary words are chosen from
+ * @param {number} wordCount        - the number of words chosen for a password
+ * @param {number} separatorCount   - the number of different possible separators (can be *any* token
+ * 									  that is valid for use in a password, a common set might be [email protected]#$%^&*)
+ * @param {number} maxGuessesPerSec - the maximimum amount of guesses per second your attacker might 
+ *                                    make against the resulting list
+ * 
+ * @returns {Object} - an object containing the days, years, and centuries required to go through the entire list 
+ */
+function guesser(words, wordCount, separatorCount, tailingNumberCount, maxGuessesPerSec) {
+    // Formula:
+    // (words * separatorCount) ^ wordCount) * tailingNumberCount
+    // JS needs Math.pow() sadface 
+    var possibilities = Math.pow((words * separatorCount), wordCount) * tailingNumberCount;
+    var secondsToComplete = possibilities / maxGuessesPerSec;
+    var days = secondsToComplete / 60 / 60 / 24; 
+    return {
+        days: Math.floor(days),
+        years: Math.floor(days / 365),
+        centuries: Math.floor(days / 365 / 100),
+    };
+
+}
+// e.g. 2000 words in the dictionary, 4 words for the password, 5 possible separators, 10 possible numbers, 1000000 guesses per second
+// guesser( 2000, 4, 5, 10, 1000000 );
+// =>
+// {
+//     days: 1157407, 
+//     years: 3170, 
+//     centuries: 31
+// }
+guesser( 2000, 4, 5, 10, 1000000 );