Pull to refresh

Генератор надежных и запоминаемых паролей на Javascript

Reading time 3 min
Views 15K
image
Представляемый генератор паролей создает относительно легко запоминающиеся и, в тоже время, трудноподбираемые пароли. Основная идея состоит в том, что пароли генерируются на основе слогов и поэтому выглядят как слова или словосочетания. Для лучшего запоминания используются заглавные буквы в начале каждого слога.

Проект на Google.Code:
code.google.com/p/jspassgen/downloads/list
Пример работы можно посмотреть здесь:
бизнес-книги.рус/ext/jspassgen/example.html

За основу был взят несколько другой алгоритм, хорошо описанный автором, Сергеем Михайловичем Свешниковым:
«Составлялись слоги из одной гласной и одной согласной буквы, расположенных в случайном порядке относительно друг-друга. Случайные буквы в пароле делались заглавными. Некоторые слоги разделялись цифрами, причём число цифр всегда было чётно (но случайно и не больше половины). Цифры могли стоять парами. Получался пароль заданной длинны, достаточно красивый и сложный. Число символов было чётным (ну нравилось мне так)»

Данный же алгоритм не фиксирует число символов в пароле, и рассчитан на практическое применение в качестве списка случайных предлагаемых пользователю паролей, например, при регистрации, позволяя, при желании, изменить сложность пароля регулированием количества слогов.
Так же присутствует механизм регуляции количества цифр в предлагаемых паролях, путем введения коэффициента numProb и его шага для уменьшения вероятности появления цифр с каждым новым слогом.

<style> 
.jsPassGenWrapper { 
    width:300px; 
    height:180px; 
    padding:10px; 
    border:1px solid #aaa; 
} 
.jsPassGenWrapper #jsPassGenForm { 
    float:left; 
    width:50%; 
    font-size:16px; 
    font-family:Courier, serif; 
} 
.jsPassGenWrapper .jsPassGenCtrls { 
    float:right; 
    width:50%; 
    margin-top:100px; 
} 
.jsPassGenWrapper input { 
    padding:0px 10px; 
} 
</style> 
<div class="jsPassGenWrapper"> 
    <div id="jsPassGenForm"></div> 
    <div class="jsPassGenCtrls"> 
        <input type="checkbox" id="jsPassGenUseNumsCB" checked="checked" /> 
        <label for="jsPassGenUseNumsCB">Use numbers</label><br /> 
        <input type="button" value="Create password" onClick="runPassGen()" /> 
    </div> 
<script type="text/javascript"> 
/* @param id - идентификатор блока для вставки паролей)
@param syllableNum - количество слогов в пароле
@param numPass - количество количество паролей вставляемых в блок
@param useNums - использовать числа или нет */ 
function jsPassGen(id, syllableNum, numPass, useNums) { 
    id = typeof(id) != 'undefined' ? id : 'jsPassGenForm';    // параметры по умолчанию
    syllableNum = typeof(syllableNum) != 'undefined' ? syllableNum : 3;
    numPass = typeof(numPass) != 'undefined' ? numPass : 10; 
    useNums = typeof(useNums) != 'undefined' ? useNums : true;

    function rand(from, to) { 
        from = typeof(from) != 'undefined' ? from : 0;    // параметры
        to = typeof(to) != 'undefined' ? to : from + 1;    // по умолчанию
        return Math.round(from + Math.random()*(to - from)); 
    }; 

    function getRandChar(a) { 
        return a.charAt(rand(0,a.length-1)); 
    } 

    var form = document.getElementById(id); 
    // Наиболее подходящие согласные для использования их в качестве заглавных
    var cCommon = "bcdfghklmnprstvz"; 
    var cAll = cCommon + "jqwx";    // Все согласные 
    var vAll = "aeiouy";    // Все гласные 
    var lAll = cAll + vAll;    // Все буквы

    form.innerHTML = ""; 
    for(var j = 0; j < numPass; ++j) { 
        // Коэффициент определяющий вероятность появления числа между слогами
        var numProb = 0, numProbStep = 0.25;
        for(var i = 0; i < syllableNum; ++i) { 
            if(Math.round(Math.random())) { 
                form.innerHTML += getRandChar(cCommon).toUpperCase() + 
                                    getRandChar(vAll) + 
                                    getRandChar(lAll); 
            } else { 
                form.innerHTML += getRandChar(vAll).toUpperCase() +  
                                    getRandChar(cCommon); 
            } 
            if(useNums && Math.round(Math.random() + numProb)) { 
                form.innerHTML += rand(0,9); 
                numProb += numProbStep; 
            } 
        } 
        form.innerHTML += "<br />"; 
    } 
    return false; 
} 

function runPassGen() { 
    jsPassGen('jsPassGenForm', 3, 10, jsPassGenUseNumsCB.checked);
} 

runPassGen(); 
</script> 
</div>


P.S.: Светлые мысли из комментариев:
Советуемые программы-генераторы паролей:
password.nanohertz.net
genpas.narod.ru
pwgen-win.sourceforge.net
genpas.ru

И один генератор ников %):
mbeaver.narod.ru/nicks

Sicness #:
идея снижает энтропию пароля и как следствие, применять стоит не везде.

docomo #:
… Сгенерированный на js пароль предлагается пользователю как один из вариантов непосредственно в форме регистрации, в то время как созданный на сервере пароль ставится принудительно.

gonzazoid #:
имхо из запоминающихся техник самая надежная — техника шокирующего абсурда. Пароли типа «моллюски отгрызли мои танцующие гениталии». Повторюсь — это из запоминаемых. Описано здесь www.ozon.ru/context/detail/id/855490
Tags:
Hubs:
+36
Comments 59
Comments Comments 59

Articles