2016-12-04 9 views
-1

私たちは、キーストロークダイナミクスによるパスワード認証システムを行っています。登録処理中に、システムはパスワードを3回入力するようにユーザーに求め、毎回各キーの間の待ち時間を取って追加します。したがって、毎回3つの異なる値があり、3つの値の平均値を取ると、それが最終値になります。各キー間のレイテンシをどのようにして配列に格納し、平均を計算するのですか?すべてのkeyDownが、これは私のアプローチでこの機能 new Date().getTime()キーストロークダイナミクス - 飛行時間計算

を使用してmilisecondの現在時刻を取得するに

答えて

0

を望んでいたとして、あなたがそれを使用することができ

 

    var try_counter = 0; 
    var container = [[],[],[]]; 

    function onKeyHit(){ 
     var time = new Date().getTime(); 
     container[try_counter].push(time); 
    } 

    function onSumbitButtonHit(){ 
     try_counter++; 
    } 

そして、あなたは差をとることにより、比較的容易に平均値を計算することができます現在および次のキーストローク(存在する場合)そこから、差の合計を合計キーストローク数(マイナス1)で単純に平均化することができます。注:これはこれまでの中で最も洗練されたソリューションではないかもしれませんが、概念の良い証拠です。

/** 
 
* Log the keypresses 
 
*/ 
 
var handler = function(e) { 
 
    var inputName = $(this).attr("name"); 
 
    if (inputName == "password1") handler.data.password1.push(e); 
 
    if (inputName == "password2") handler.data.password2.push(e); 
 
    if (inputName == "password3") handler.data.password3.push(e); 
 
} 
 

 
// Init data 
 
handler.data = {}; 
 
handler.data.password1 = []; 
 
handler.data.password2 = []; 
 
handler.data.password3 = []; 
 

 
$(":password").on("keyup", handler); 
 

 
/** 
 
* Calculate averages 
 
*/ 
 
function getAvg(dataInput) { 
 
    var sum = 0; 
 
    $.each(dataInput, function(index, value) { 
 
    if (typeof dataInput[index + 1] != 'undefined') { 
 
     sum += (dataInput[index + 1].timeStamp - value.timeStamp); 
 
    } 
 
    }); 
 
    return sum/dataInput.length; 
 
} 
 

 
/** 
 
* Run calculations 
 
*/ 
 
$("input[type='submit']").on('click', function(e) { 
 
    var pw1 = $("input[name='password1']"), 
 
     pw2 = $("input[name='password2']"), 
 
     pw3 = $("input[name='password3']"); 
 

 
    e.preventDefault(); 
 

 
    if (pw1.val().length && pw1.val() == pw2.val() && pw1.val() == pw3.val()) { 
 
    var pw1Avg = getAvg(handler.data.password1), 
 
     pw2Avg = getAvg(handler.data.password2), 
 
     pw3Avg = getAvg(handler.data.password3); 
 

 
    $("#output").html('PW1 Avg between key strokes: ' + Math.round(pw1Avg) + 'ms<br>' + 
 
     'PW2 Avg between key strokes: ' + Math.round(pw2Avg) + 'ms<br>' + 
 
     'PW3 Avg between key strokes: ' + Math.round(pw3Avg) + 'ms'); 
 

 
    // Reset data 
 
    $("input[type='password']").val(''); 
 
    handler.data = {}; 
 
    handler.data.password1 = []; 
 
    handler.data.password2 = []; 
 
    handler.data.password3 = []; 
 
    } else { 
 
    $("#output").html('All passwords must match!'); 
 
    } 
 

 
    return false; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<form method="get"> 
 
    <p> 
 
    <input type="password" name="password1"> 
 
    </p> 
 
    <p> 
 
    <input type="password" name="password2"> 
 
    </p> 
 
    <p> 
 
    <input type="password" name="password3"> 
 
    </p> 
 
    <p> 
 
    <input type="submit"> 
 
    </p> 
 
</form> 
 
<p id="output"></p>

+0

コードを試してみましたが、それは私のブラウザでは動作しません。私はsrcのgoogle apiリンクと関係があると思う。何が問題なのか知っていますか? –

+0

コンソールで確認してください –

0

あなたはリスナーを作成することができます。 milisecond内のすべての時間を配列に格納され、あなたがイベントのタイムスタンプデータを使用して