为什么我的crypto. sublite .digest的实现对相同长度的字符串产生相同的十六进制哈希值?
Why does my implementation of crypto.sublte.digest result in equivalent hex hashes for equal length strings?
以下代码改编自这两个来源:
http://qnimate.com/hashing-using-web-cryptography-api/https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest(function () {
"use strict";
var crypto = window.crypto || window.msCrypto;
if (typeof crypto.subtle === "undefined") {
return;
}
function convertStringToArrayBuffer (str) {
var strLength = str.length, buffer = new ArrayBuffer(strLength), i = 0;
while (i < strLength) {
buffer[i] = str.charCodeAt(i);
i += 1;
}
return buffer;
}
function convertBufferToHex (buffer) {
var data = new DataView(buffer), i = 0,
dataLength = data.byteLength, cData = null,
hexValue = '';
while (i < dataLength) {
cData = data.getUint8(i).toString(16);
if (cData.length < 2) {
cData = '0' + cData;
}
hexValue += cData;
i += 1;
}
return hexValue;
}
function digest (str) {
var buf = convertStringToArrayBuffer(str);
return crypto.subtle.digest("SHA-256", buf).then(function (hash) {
return convertBufferToHex(hash);
});
}
window.sha256 = {
"convertStringToArrayBuffer": convertStringToArrayBuffer,
"convertBufferToHex": convertBufferToHex,
"digest": digest
};
}());
使用sha256.digest("this string").then(function (x) { console.log(x) } );
和sha256.digest("that strong").then(function (x) { console.log(x) } );
在Chrome或Firefox控制台中运行时会产生相同的十六进制字符串。
实际上,任意两个长度相同的字符串将具有相同的十六进制表示。
我读到的所有东西都说有两个等效的哈希是罕见的。也就是说我做错了什么。我不知道那是什么
好了,我终于想通了。
根据MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer,不能直接赋值给ArrayBuffer
相反,你必须使用像Uint8Array, Uint16Array, DataView等来分配值给ArrayBuffer。
所以我改变了
function convertStringToArrayBuffer (str) {
var strLength = str.length, buffer = new ArrayBuffer(strLength), i = 0;
while (i < strLength) {
buffer[i] = str.charCodeAt(i);
i += 1;
}
return buffer;
}
function convertStringToArrayBuffer (str) {
var strLength = str.length, buffer = new Uint8Array(strLength), i = 0;
while (i < strLength) {
buffer[i] = str.charCodeAt(i);
i += 1;
}
return buffer;
}
瞧!: D
相等长度的字符串不再有匹配的散列。
相关文章:
- 在js中将字符串转换为十六进制
- 将十六进制字符串转换为字节数组
- JavaScript 中两个十六进制字符串的 XOR
- 在JavaScript/NodeJS中压缩十六进制字符串
- 不带编码的十六进制字符串
- 如何使用十六进制转义来破坏JavaScript字符串
- JavaScript RegEx - 加载十六进制或空字符串的动态字段
- 编码/解码十六进制为 utf-8 字符串
- 将字符串解析为一系列转义十六进制字符的方法是什么
- 删除错误.MongooDB + Express.传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符
- 在 Javascript 中更轻松地处理十六进制字符串和十六进制值
- 将带有转义字符和 ASCII 值的字符串转换为十六进制
- 从十六进制字符串中获取原始十六进制
- 识别 Javascript 字符串中的连续十六进制字符块
- 如何在 JavaScript 中将字符串中不确定的 rgb 出现次数转换为十六进制
- 实时颜色选择器 HSV 到十六进制字符串
- 应用于表示负十六进制的字符串的 JS 一元加运算符的行为
- 解码或转义字符串中的十六进制代码编号
- 如何从 JS 中的字符串中获取十六进制整数
- 如何将中文十六进制字符串解码为中文字符或JavaScript