Polskie Silne Haslo
<html>
<head>
<meta charset="utf-8">
<title>Polskie silne hasło</title>
<style type="text/css">
body {background: #f5f5f5;}
td {vertical-align: top; padding: 0 2em;}
li, code {font-family: monospace; font-size: 1.3em;}
#info {position: absolute; top: 15px; width: 500px; right: 30px; height: 80%; margin: 20px auto; background: #fff; border-radius: 5px; padding: 0 15px 15px; box-shadow: 0 5px 20px #000; overflow: auto;}
</style>
</head>
<body>
<p id="loading">Ładuję</p>
<section style="display: none" id="body">
<a style="float: right" href="">Nowy zestaw</a>
<a style="clear: right; float: right; margin-top: 1em" href="#info">Informacje</a>
<table>
<tr>
<td id="3-words">
<h3>3 polskie słowa</h3>
<p>Siła hasła: 1,25×10¹⁴</p>
<ul></ul>
</td>
<td id="7-chars">
<h3>7 losowych znaków</h3>
<p>Siła hasła: 6,48×10¹³</p>
<ul></ul>
</td>
</tr>
<tr>
<td id="4-words">
<h3>4 polskie słowa</h3>
<p>Siła hasła: 6,25×10¹⁸</p>
<ul></ul>
</td>
<td id="9-chars">
<h3>9 losowych znaków</h3>
<p>Siła hasła: 5,73×10¹⁷</p>
<ul></ul>
</td>
</tr>
<tr>
<td id="5-words">
<h3>5 polskich słów</h3>
<p>Siła hasła: 3,12×10²³</p>
<ul></ul>
</td>
<td id="11-chars">
<h3>11 losowych znaków</h3>
<p>Siła hasła: 5,06×10²¹</p>
<ul></ul>
</td>
</tr>
</table>
</section>
<section id="info" style="display: none">
<a style="float: right; padding-top: 15px" href="#info">zamknij</a>
<h2>O co chodzi?</h2>
<p>Przeczytawszy <a href="https://xkcd.com/936/">ten pasek znanego komiksu XKCD</a> uświadomiłem sobie ważną rzecz dotyczącą haseł.</p>
<p>"Wymogi bezpieczeństwa" często nakazują nam używanie haseł złożonych z przynajmniej ośmiu znaków w tym dużych i małych liter, symboli i cyfr.</p>
<p>Hasła te są skutecznym sposobem na ochronę użytkowników serwisu przed brute-forcem.</p>
<p>Czy na pewno? Użytkownicy jako hasło chcieliby zastosować coś prostego, np. swoje imię, imię swojego psa, datę ślubu albo inny wyraz, który znają i łatwo zapamiętają, ale wymogi bezpieczeństwa każą im używać znaków specjalnych, cyfr itd. Modyfikują więc swoje hasło tak, aby je spełniało, zazwyczaj zapisując słowo z wielkiej litery i doklejając na końcu "1!". Znając zatem słowo bazowe łatwo w kilku próbach trafić na hasło użytkownika.</p>
<p>Ze strony użytkownika wygląda to gorzej. Pamięta, że hasłem była ksywka jego kumpla, ale nie pamięta jakich modyfikacji musiał użyć, żeby system zaakceptował je jako hasło.</p>
<p>Tworzy się dziwna sytuacja, że hasła użytkowników są łatwe do złamania, za to trudne do zapamiętania. Użytkownik więc musi albo owe hasło zapisać, albo po prostu je zapomni.</p>
<p>Aby hasła były naprawdę silne i niemożliwe do złamania w sposób wywiadowczy (przez zebranie danych o osobie), muszą być generowane losowo. Takie hasła można złamać tylko brute-forcem. Ale jak sprawić, aby były one łatwe do zapamiętania?</p>
<p>Załóżmy, że system wygeneruje dla nas hasło złożone z 7-miu znaków dostępnych z klawiatury (jest ich 94): <code>FS!O{1K</code>. Potencjalny włamywacz ma do sprawdzenia 94<sup>7</sup> (94×94×94×94×94×94×94) haseł (liczbę tę nazwijmy siłą hasła). Jednym z nich jest nasza kombinacja. Załóżmy, że dodatkowo wykradł z naszego serwera hasz MD5 naszego hasła: <code>d9235c0aa5a62a6a3a03cb915a931f8c</code>. Załóżmy, że dysponuje komputerem zdolnym przeliczyć milion haszy MD5 w ciągu sekundy. Sprawdzenie wszystkich możliwych haseł zajmie mu nieco ponad 64 miliony sekund, czyli 18 tysięcy godzin, czyli 2 lata. Ale zakładając, że ma farmę konsol PlayStation potrafiącą obliczyć milard haszy MD5 na sekundę, złamanie hasła zamie mu niecały dzień. Dokładając dwa kolejne losowo wygenerowane znaki do hasła wydłużamy łamanie hasła 8836 razy (94×94).</p>
<p>Mam nadzieję, że już Cię przekonałem do tego, aby losowo generować 9-znakowe hasła do wszystkich serwisów, gdzie tylko masz konto. A może nie? Już wiem! Hasła o takiej konstrukcji są trudne do zapamiętania.</p>
<p>A co powiesz na hasło złożone z 3 polskich wyrazów? Posiadając listę 50 tysięcy słów z języka polskiego <a href="http://www.open-dictionaries.com/i27.html">(słownik częstościowy z 2008 roku)</a> mogę wygenerować Ci hasło o sile większej od siedmiu losowych znaków a do zapamiętania będziesz miał tylko 3 wyrazy w Twoim ojczystym języku. No i nie musisz się zastanawiać gdzie wstawiłeś cyfrę zamiast litery albo jakiego znaku specjalnego użyłeś. Słowa pozbawione są polskich ogonków, więc można je wpisać na każdej klawiaturze (również za granicą).</p>
<p>Sprawdź i oceń sam, czy łatwiej zapamiętać wygenerowane losowo hasła z lewej kolumny, czy z prawej. Te z lewej kolumny są silniejsze od tych z prawej dla danego wiersza.</p>
<p>Jedyny problem z tymi hasłami to brak możliwości ich ustawienia w dużej części Internetu. Np. na Allegro hasło może składać się z maksymalnie 16-stu znaków. Większość haseł wygenerowanych na tej stronie ma więcej znaków. Kolejny problem to wymaganie przez niektóre serwisy użycia wielkiej litery, cyfry i znaku specjalnego w haśle. Proponuję w takiej sytuacji zakończyć hasło znakami <code>1!</code>. Nie wzmocni to naszego hasła, ale hasło już mamy mocne, więc nie przejmujmy się tym.</p>
<p><strong>Ta strona to tylko demonstracją problemu. Nie używaj generowanych tu haseł, chyba, że przejrzysz kod strony i ufasz implementacji JavaScriptowej funkcji Math.random() w Twojej przeglądarce</strong></p>
</section>
<script type="text/javascript" src="/local--files/polskie-silne-haslo/polskie-slowa.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
 
var chars = '`1234567890[]';
chars += ',.pyfgcrl/=\\';
chars += 'aoeuidhtns-';
chars += ';qjkxbmwvz';
chars += '~!@#$%^&*(){}';
chars += '<>PYFGCRL?+|';
chars += 'AOEUIDHTNS_';
chars += ':QJKXBMWVZ';
chars += '"\'';
 
function gen(number_of_words, words, delimiter) {
    var w = [];
    for (var i = 0; i < number_of_words; i++) {
        var r = Math.floor(Math.random() * words.length);
        w.push(words[r]);
    }
    return w.join(delimiter);
}
 
var number_of_passwords = 5;
for (var i = 0; i < number_of_passwords; i++) {
    $('#3-words > ul').append($('<li/>').text(gen(3, words, ' ')));
    $('#4-words > ul').append($('<li/>').text(gen(4, words, ' ')));
    $('#5-words > ul').append($('<li/>').text(gen(5, words, ' ')));
    $('#7-chars > ul').append($('<li/>').text(gen(7, chars, '')));
    $('#9-chars > ul').append($('<li/>').text(gen(9, chars, '')));
    $('#11-chars > ul').append($('<li/>').text(gen(11, chars, '')));
}
 
$('#loading').hide();
$('a[href="#info"]').click(function() {
    $('#info').toggle();
    return false;
});
$('#body').show();
 
</script>
</body>
</html>
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License