2016-04-27 1 views
1

Я пытаюсь использовать функцию nodejs createHmac из своей криптографической библиотеки.nodejs crypto hmac производит разные хэши, если секрет передается как литерал против переменной

Проблема: он создает разные хэши при заданных (по-видимому) одинаковых аргументах. Единственное различие заключается в том, является ли «секретный» параметр строковой переменной или строковым литералом.

Следующий SPA изолирует проблему. Я использую nwjs (node ​​webkit) SDK flavor v 0.14.2 для запуска этого кода на OS X El Cap.

Любая помощь и помощь с благодарностью получены.

index.html

<!DOCTYPE html> 
<html> 
<head> 
    <title>Context Menu</title> 
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" 
    rel="stylesheet" 
    integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" 
    crossorigin="anonymous"> 
</head> 
<body style="width: 100%; height: 100%;"> 

<div id="wrapper"> 
</div> 

<script src="https://code.jquery.com/jquery-2.2.3.min.js" 
    integrity="sha256-a23g1Nt4dtEYOj7bR+vTu7+T8VP13humZFBJNIYoEJo=" 
    crossorigin="anonymous"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" 
    integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" 
    crossorigin="anonymous"></script> 
<script type="text/javascript" src="./index.js"></script> 
</body> 
</html> 

index.js

var nodeCrypto = require('crypto'); 

var payload = 'twas brillig and the slithy toves did gyre and gimble in the wabe'; 

// 
// simple UI to get a user-entered secret 
// and echo the results. 
// enter 'wibble' in input element to demo the problem to match hard coded literal 
// 
$('#wrapper').append (
    $('<div>').addClass('form-group') 
     .append (
      $('<label>').attr('for','userinput').text('Tell me a secret:'), 
      $('<input>').addClass('form-control').attr('type','text').attr('id','userinput') 
     ), 
    $('<p>').attr('id', 'hash'), 
    $('<p>').attr('id', 'nash') 
); 

$('input').on('change', function (ev) { 

    // compute hash based on user input 
    var hash = nodeCrypto.createHmac ('sha256', $(this).val()) 
     .update (payload) 
     .digest ('hex');    
    console.log ('hash: ' + hash); 
    $('p[id=hash]').text('secret: ' + $(this).val() + ', hash: ' + hash); 
    // logs hash: f7b4ae1aaa35b813571f00bca7c81d08176b56cb3a1d1f8c8ba95a17ba6f6f29 
    // as long as user enters 'wibble' 

    // compute hash based on string literal 
    var nash = nodeCrypto.createHmac ('sha256', 'wibble') 
       .update (payload) 
       .digest ('hex');    
    console.log ('nash: ' + nash); 
    $('p[id=nash]').text('secret: wibble, hash: ' + nash); 
    // logs hash: c9592948b3de038c9aa339f94b61928de803417183a6c95b1829a04c69fe6bf6 

}); 

Screengrab Shows user input together with computed hashes

package.json

{ 
    "name": "hmac", 
    "main": "index.html", 
    "description": "nodejs crypto hmac test", 
    "author": "xxx" 
} 

ответ

1

Там кое-что о дисциплине изоляции проблемы и писать объяснение жесткого, но справедливого толпы, которая StackOverflow, что часто кажется, вытряхнуть решение все само по себе.

Так что извиниться за это 'задали & ответил'. Я просто рад получить решение.

Немного дальнейших эксперименты дал эти идеи:

  1. отжимных аргумент, чтобы быть отдельным объектом с помощью

secret = new String(...)

вызвал отказ внутри криптографической библиотеки узла:

TypeError: not a buffer.

Это ключ!

  1. после преобразования пользовательского ввода в буфер, прежде чем передать его как секрет createHmac, приведет к согласованному поведению между двумя вызовами.

Обновленные JS

// compute hash based on user input 
    var secretStr = $(this).val(); 
    var hash = nodeCrypto.createHmac ('sha256', secretStr) 
     .update (payload) 
     .digest ('hex');    
    console.log ('hash: ' + hash); 
    $('p[id=hash]').text('secret: ' + $(this).val() + ', hash: ' + hash); 
    // logs hash: f7b4ae1aaa35b813571f00bca7c81d08176b56cb3a1d1f8c8ba95a17ba6f6f29 
    // as long as user enters 'wibble' 

    // compute hash based on string literal 
    var nash = nodeCrypto.createHmac ('sha256', 'wibble') 
     .update (payload) 
     .digest ('hex');    
    console.log ('nash: ' + nash); 
    $('p[id=nash]').text('secret: wibble, nash: ' + nash); 
    // logs nash: c9592948b3de038c9aa339f94b61928de803417183a6c95b1829a04c69fe6bf6 

    // compute hash based on Buffer initialised from user input 
    var secretBuf = Buffer.from($(this).val()); 
    var mash = nodeCrypto.createHmac ('sha256', secretBuf) 
     .update (payload) 
     .digest ('hex');    
    console.log ('nash: ' + nash); 
    $('p[id=mash]').text('secret: wibble, mash: ' + nash); 
    // logs mash: c9592948b3de038c9aa339f94b61928de803417183a6c95b1829a04c69fe6bf6 
Смежные вопросы