我试图将写在Python上的散列算法转换为node.js。
python代码看起来像是
import uuid
import hashlib
import struct
CLIENT_ID = uuid.UUID('c5f92e0d-e762-32cd-98cb-8c546c410dbe')
SECRET = uuid.UUID('2cf26ff5-bd06-3245-becf-4d5a3baa704f')
data = CLIENT_ID.bytes_le + SECRET.bytes_le + struct.pack("I", 2017) + struct.pack("I", 9) + struct.pack("I", 2)
token = str(uuid.UUID(bytes_le=hashlib.sha256(data).digest()[0:16])) 生成的令牌是32d86f00-eb49-2739-e957-91513d2b9969。
在这里,日期值struct.pack值是使用datetime生成的,但是为了方便起见,我在这里进行了硬编码。
我试图通过查看相应库的python来进行相同的转换,并完成了以下工作:
let CLIENT_ID = new Buffer('c5f92e0d-e762-32cd-98cb-8c546c410dbe');
let SECRET = new Buffer('2cf26ff5-bd06-3245-becf-4d5a3baa704f');
let d = new Buffer(2);
let m = new Buffer(9);
let y = new Buffer(2017);
let data = CLIENT_ID+SECRET+y+m+d;
const uuidv4 = require('uuid/v4');
const hash = crypto.createHash('sha256');
let token = uuidv4({random: hash.update(data, 'utf8').digest().slice(0, 16)}, 0);它生成的散列是b7b82474-eab4-4295-8318-cc258577ff9b。
因此,基本上,我很不幸地遗漏了nodejs部分的一些内容。
你能告诉我哪里出了什么问题吗?谢谢你的帮助
发布于 2017-09-03 00:10:03
有很多漏掉的部分,实际上它已经调好了。
###node零件:
new Buffer('c5')
不表示<Buffer c5>,而是表示<Buffer 63 35>。
要编写c5,您需要使用Buffer.from([0xc5])或Buffer.from([197]) (12月)。new Buffer(2)
不表示<Buffer 02>,它只分配两个字节。CLIENT_ID+SECRET+y+m+d
缓冲器的级联不是这样工作的。
使用缓冲区数组和Buffer.concat([buffers])连接缓冲区。###uuid零件:
bytes_le部件)#最有趣的部分:
uuid.UUID(...),uuid将生成一个ID而不修改位。
根据rfc-41224.4 uuid 应该修复那个部分。
uuid.py跳过rfc-41224.4
节点-uuid/v4.js修复所需的位
这样,即使sha256散列的结果相同,python和节点实现之间的结果仍然会有所不同。
python: 32d86f00-eb49-2739-e957-91513d2b9969节点:32d86f00-eb494739-a957-91513d2b9969^所以,我在这里看到两个选择
32d86f00-eb49-4739-a957-91513d2b9969node-uuid/v4.js中可以选择分叉uuid并删除两行代码下面代码的##See节点版本:
const uuidv4 = require('uuid/v4');
const crypto = require('crypto');
const hash = crypto.createHash('sha256');
const client_id_hex_str = "c5f92e0d-e762-32cd-98cb-8c546c410dbe".replace(/-/g, "");
const secret_hex_str = "2cf26ff5-bd06-3245-becf-4d5a3baa704f".replace(/-/g, "");
let CLIENT_ID = Buffer.from(to_bytes_le(to_bytes(client_id_hex_str, null, 16, 'big')));
let SECRET = Buffer.from(to_bytes_le(to_bytes(secret_hex_str, null, 16, 'big')));
let d = Buffer.from(to_bytes(null, 2, 4));
let m = Buffer.from(to_bytes(null, 9, 4));
let y = Buffer.from(to_bytes(null, 2017, 4));
let data = Buffer.concat([CLIENT_ID, SECRET, y, m, d]);
let hashBytes = hash.update(data, 'utf8').digest().slice(0, 16);
hashBytes = [].slice.call(hashBytes, 0);
hashBytes = Buffer.from(to_bytes_le(hashBytes));
let token = uuidv4({random: hashBytes});
console.log(token);
// https://stackoverflow.com/questions/16022556/has-python-3-to-bytes-been-back-ported-to-python-2-7
function to_bytes(hexString, number, length, endianess) {
if (hexString == null && number == null) {
throw new Error("Missing hex string or number.");
}
if (!length || isNaN(length)) {
throw new Error("Missing or invalid bytes array length number.");
}
if (hexString && typeof hexString != "string") {
throw new Error("Invalid format for hex value.");
}
if (hexString == null) {
if (isNaN(number)) {
throw new Error("Invalid number.");
}
hexString = number.toString(16);
}
let byteArray = [];
if (hexString.length % 2 !== 0) {
hexString = '0' + hexString;
}
const bitsLength = length * 2
hexString = ("0".repeat(bitsLength) + hexString).slice(-1 * bitsLength);
for (let i = 0; i < hexString.length; i += 2) {
const byte = hexString[i] + hexString[i + 1];
byteArray.push(parseInt(byte, 16));
}
if (endianess !== "big") {
byteArray = byteArray.reverse();
}
return byteArray;
}
// https://github.com/python/cpython/blob/master/Lib/uuid.py#L258
function to_bytes_le(bytes) {
const p1 = bytes.slice(0, 4).reverse();
const p2 = bytes.slice(4, 6).reverse();
const p3 = bytes.slice(6, 8).reverse();
const p4 = bytes.slice(8);
const bytes_le = [].concat.apply([], [p1, p2, p3, p4]);
return bytes_le;
}发布于 2017-09-02 16:01:03
您希望数据的散列与上面的Python代码相同吗?如果没有,您可以查看下面的Sha256模块( NodeJS )
https://stackoverflow.com/questions/46015397
复制相似问题