Я пытаюсь использовать функцию 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"
}