javascript - 是否有任何接受十六进制输入的 JavaScript 加密 HMAC 库?

标签 javascript security hash cryptography hmac

现在假设这是在浏览器扩展中完成或在本地运行。我有一个用例,我想使用 HMAC(key, data) 使用加密 key 对一些数据进行哈希处理。然而, key 是随机位,而不是文本或其他可读格式。我认为最好的方法是将 key 转换为十六进制或 base64,然后将其输入到哈希函数中。

有一个 JavaScript 库可以做到这一点,那就是 jsSHA .它可以为 key 和文本采用十六进制、base64 和文本的输入类型。不幸的是,这个库只执行当前的 SHA 算法,我需要一些不同的算法,例如 SHA3 或 Skein。

我研究过使用 CryptoJS 和 jsDigest,但它们似乎不允许十六进制或 base64 输入,只有文本。

https://code.google.com/p/crypto-js/
https://github.com/coiscir/jsdigest
  1. 是否有其他库可以使用 hex/base64 输入执行 HMAC?

  2. 能否轻松修改上述库以允许 hex/base64 输入?

更新

正如@owlstead 提到的,您确实可以使用 CryptoJS 加载 hex/base64 作为输入。我在下面使用十六进制/文本中的键/消息的所有组合添加了一些测试。

// Test CryptoJS
// CryptoJS.HmacSHA512("Message", "Secret Passphrase");
var wordsKey = CryptoJS.enc.Hex.parse('001122334455');
var wordsMsg = CryptoJS.enc.Hex.parse('aabbccddeeff');
var hash = CryptoJS.HmacSHA512(wordsMsg, wordsKey);
var output = hash.toString(CryptoJS.enc.Hex);

console.log('CryptoJS hex msg and hex key ' + output);

var wordsKey = CryptoJS.enc.Hex.parse('001122334455');
var wordsMsg = CryptoJS.enc.Latin1.parse('aabbccddeeff'); // or simply use string 'aabbccddeeff'
var hash = CryptoJS.HmacSHA512(wordsMsg, wordsKey);
var output = hash.toString(CryptoJS.enc.Hex);

console.log('CryptoJS text msg and hex key ' + output);

var wordsKey = CryptoJS.enc.Latin1.parse('001122334455'); // or simply use string '001122334455' 
var wordsMsg = CryptoJS.enc.Hex.parse('aabbccddeeff');
var hash = CryptoJS.HmacSHA512(wordsMsg, wordsKey);
var output = hash.toString(CryptoJS.enc.Hex);

console.log('CryptoJS hex msg and text key ' + output);

var wordsKey = CryptoJS.enc.Latin1.parse('001122334455'); // or simply use string '001122334455'
var wordsMsg = CryptoJS.enc.Latin1.parse('aabbccddeeff');
var hash = CryptoJS.HmacSHA512(wordsMsg, wordsKey);
var output = hash.toString(CryptoJS.enc.Hex);

console.log('CryptoJS text msg and text key ' + output);

// Test jsSHA
// jsSHA(srcString, inputFormat)
// getHMAC(key, inputFormat, variant, outputFormat)
var shaObj = new jsSHA("aabbccddeeff", "HEX");
var hmac = shaObj.getHMAC("001122334455", "HEX", "SHA-512", "HEX");

console.log('jsSHA hex msg and hex key ' + hmac);

var shaObj = new jsSHA("aabbccddeeff", "TEXT");
var hmac = shaObj.getHMAC("001122334455", "HEX", "SHA-512", "HEX");

console.log('jsSHA text msg and hex key ' + hmac);

var shaObj = new jsSHA("aabbccddeeff", "HEX");
var hmac = shaObj.getHMAC("001122334455", "TEXT", "SHA-512", "HEX");

console.log('jsSHA hex msg and text key ' + hmac);

var shaObj = new jsSHA("aabbccddeeff", "TEXT");
var hmac = shaObj.getHMAC("001122334455", "TEXT", "SHA-512", "HEX");

console.log('jsSHA text msg and text key ' + hmac);

// Test PHP hash_hmac
// string hash_hmac( string $algo , string $data , string $key)
echo 'PHP hash_hmac hex msg and hex key ' . hash_hmac('sha512', "\xaa\xbb\xcc\xdd\xee\xff", "\x00\x11\x22\x33\x44\x55") . '<br>';
echo 'PHP hash_hmac text msg and hex key ' . hash_hmac('sha512', "aabbccddeeff", "\x00\x11\x22\x33\x44\x55") . '<br>';
echo 'PHP hash_hmac hex msg and text key ' . hash_hmac('sha512', "\xaa\xbb\xcc\xdd\xee\xff", "001122334455") . '<br>';
echo 'PHP hash_hmac text msg and text key ' . hash_hmac('sha512', "aabbccddeeff", "001122334455") . '<br>';

输出:

CryptoJS hex msg and hex key 61980b30fed7674f4afae84e32e04d651e8e4b98eb48fde99e9779bb3af6072e56c0b75bb6356fe7bb9d2702d1c4b59eefc987449e8c6275549a6140338be4dd
CryptoJS text msg and hex key afd32064dea61ce40d6f3ccebe9c05d094115f8269c5df7909bc98ccaf43103e1e114ac5b32bb3ebbffa70877992de8814573a6a1b2f3de78bcd17e5807b761d
CryptoJS hex msg and text key 2bc3457beeff6a78d0314d4c3fe7bfa8b185680ececd4573f6d966ade44747d8ac59b75269d034970766aec5265b7fef73d55271f38f62e083f541ca0d679d50
CryptoJS text msg and text key 21ed161ce382581dca99ea41cf8858aa13244eb7edb48ca4cd877b7c925daaf88e70de1339e16bf63c154f6f98a28bdeab6df9a4a69625cba34008368149e22b
jsSHA hex msg and hex key 61980b30fed7674f4afae84e32e04d651e8e4b98eb48fde99e9779bb3af6072e56c0b75bb6356fe7bb9d2702d1c4b59eefc987449e8c6275549a6140338be4dd
jsSHA text msg and hex key afd32064dea61ce40d6f3ccebe9c05d094115f8269c5df7909bc98ccaf43103e1e114ac5b32bb3ebbffa70877992de8814573a6a1b2f3de78bcd17e5807b761d
jsSHA hex msg and text key 2bc3457beeff6a78d0314d4c3fe7bfa8b185680ececd4573f6d966ade44747d8ac59b75269d034970766aec5265b7fef73d55271f38f62e083f541ca0d679d50
jsSHA text msg and text key 21ed161ce382581dca99ea41cf8858aa13244eb7edb48ca4cd877b7c925daaf88e70de1339e16bf63c154f6f98a28bdeab6df9a4a69625cba34008368149e22b
PHP hash_hmac hex msg and hex key 61980b30fed7674f4afae84e32e04d651e8e4b98eb48fde99e9779bb3af6072e56c0b75bb6356fe7bb9d2702d1c4b59eefc987449e8c6275549a6140338be4dd
PHP hash_hmac text msg and hex key afd32064dea61ce40d6f3ccebe9c05d094115f8269c5df7909bc98ccaf43103e1e114ac5b32bb3ebbffa70877992de8814573a6a1b2f3de78bcd17e5807b761d
PHP hash_hmac hex msg and text key 2bc3457beeff6a78d0314d4c3fe7bfa8b185680ececd4573f6d966ade44747d8ac59b75269d034970766aec5265b7fef73d55271f38f62e083f541ca0d679d50
PHP hash_hmac text msg and text key 21ed161ce382581dca99ea41cf8858aa13244eb7edb48ca4cd877b7c925daaf88e70de1339e16bf63c154f6f98a28bdeab6df9a4a69625cba34008368149e22b

一切似乎都是合法的。

最佳答案

CryptoJS 接受 WordArray 类型的输入。它is explained for that library您可以进行以下转换:

var words = CryptoJS.enc.Hex.parse('48656c6c6f2c20576f726c6421');

请注意,大多数现代加密算法都被定义为对位或字节进行操作,并且大多数实现只接受字节。任何与作为哈希函数输入的字节不同的东西都必须隐式或显式转换为字节。

一些加密库对 32 位或 64 位字而不是字节进行操作。这是因为某些加密功能最好使用 32 位或 64 位字来实现。然而,大多数图书馆向用户隐藏了此类实现细节。

关于javascript - 是否有任何接受十六进制输入的 JavaScript 加密 HMAC 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22183337/

相关文章:

php - X-Requested-With header 服务器检查是否足以防止 ajax 驱动的应用程序的 CSRF?

security - PicketLink - NoClassDefFound : org/picketlink/idm/config/StoreConfiguration

Perl:对其他散列使用引用 has

Javascript Array indexOf by Key, Value问题

javascript - ReactJs动态html,将值绑定(bind)到子类

javascript - jsTree 确定树之间的移动并更改复制的节点 ID

java - 在散列函数中使用 << 和 >>>

javascript - 如何在原型(prototype)上创建过滤器?

oracle - 如何获取触发器中要执行ddl操作的表名

arrays - 将对象数组转换为哈希表时出错