Postman CryptoJS alternative to crypto.createHash(‘md5’).upd



我试图从字符串生成UUID,我基本上想重新创建UUID.nameUUIDFromBytes在Java中所做的事情。我发现这篇文章在poster之外非常有效,Java的UUID.nameUUIDFromBytes是用JavaScript写的吗?-堆栈溢出

但加密货币在Postman中不可用。我也在poster中尝试过CryptoJS,并且已经非常接近了,生成的UUID只有一个字符…

function javaHash(test) {
var md5Bytes = CryptoJS.MD5(test);
console.log(md5Bytes);
md5Bytes[6] &= 0x0f;  /* clear version        */
md5Bytes[6] |= 0x30;  /* set to version 3     */
md5Bytes[8] &= 0x3f;  /* clear variant        */
md5Bytes[8] |= 0x80;  /* set to IETF variant  */
console.log(md5Bytes);
return md5Bytes.toString(CryptoJS.enc.Hex).replace(/-/g, "").replace(/(w{8})(w{4})(w{4})(w{4})(w{12})/, "$1-$2-$3-$4-$5");
}
console.log(javaHash('123456789'));

从控制台中的值来看,该值似乎并没有被方法中间应该发生的任何魔术(设置版本和变量(所改变。

我还尝试过从这里导入加密货币:https://cdnjs.com/libraries/crypto-js,使用此方法:在Postman中添加外部库| Postman博客

function javaHash(test) {
eval(pm.collectionVariables.get("crypto_library"));
let md5Bytes = this.crypto.createHash('md5').update(test).digest();
console.log(md5Bytes);
md5Bytes[6] &= 0x0f;  /* clear version        */
md5Bytes[6] |= 0x30;  /* set to version 3     */
md5Bytes[8] &= 0x3f;  /* clear variant        */
md5Bytes[8] |= 0x80;  /* set to IETF variant  */
console.log(md5Bytes);
return md5Bytes.toString(CryptoJS.enc.Hex).replace(/-/g, "").replace(/(w{8})(w{4})(w{4})(w{4})(w{12})/, "$1-$2-$3-$4-$5");
}

但我收到一个错误"评估请求前脚本时出错:TypeError:无法读取未定义的属性(读取"lib"(">

有什么想法吗?

CryptoJS代码中的问题是md5Bytes不是字节数组,因此后续的字节操作失败。

CryptoJS内部使用WordArray类型,即由4字节字组成的数组(此处为s(。此类型也由CryptoJS.MD5()返回。由于MD5输出大小为16个字节,WordArray由4个字(4个字节(组成
由于UUID算法修改单个字节,因此有必要访问和修改单词中的字节。这是可行的,例如通过将WordArray转换为Uint8Array,反之亦然:

var hashWA = CryptoJS.MD5('12345');
// Conversion WordArray -> Uint8Array
var binString = hashWA.toString(CryptoJS.enc.Latin1);
var md5Bytes = Uint8Array.from(binString, x => x.charCodeAt(0))
// Byte manipulations
md5Bytes[6] &= 0x0f;  
md5Bytes[6] |= 0x30; 
md5Bytes[8] &= 0x3f;  
md5Bytes[8] |= 0x80;  
// Conversion Uint8Array -> WordArray 
var uuidWA = CryptoJS.lib.WordArray.create(md5Bytes);
var uuidHex = uuidWA.toString();
var uuidFormatted = uuidHex.replace(/(w{8})(w{4})(w{4})(w{4})(w{12})/, "$1-$2-$3-$4-$5");
console.log(uuidFormatted)
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>


更有效的是MD5实现,它将散列作为字节数组(ArrayArrayBufferUint8Array(返回,以便可以直接访问字节,例如js-MD5

var md5Bytes = md5.array('12345');
md5Bytes[6] &= 0x0f;  
md5Bytes[6] |= 0x30; 
md5Bytes[8] &= 0x3f;  
md5Bytes[8] |= 0x80;
var uuidHex = Array.prototype.map.call(new Uint8Array(md5Bytes), x => ('00' + x.toString(16)).slice(-2)).join('');
var uuidFormatted = uuidHex.replace(/(w{8})(w{4})(w{4})(w{4})(w{12})/, "$1-$2-$3-$4-$5");
console.log(uuidFormatted)
<script src="https://cdn.jsdelivr.net/npm/js-md5@0.7.3/src/md5.min.js"></script>

然而,我不确定Postmanjs-md5是否是一个选项,或者是否有类似的库。


与Java的比较:UUID.nameUUIDFromBytes("12345".getBytes(StandardCharsets.UTF_8)).toString()返回相同的输出:827ccb0e-ea8a-306c-8c34-a16891f84e7b

注意,12345的十六进制编码MD5散列是827ccb0e-ea8a-706c-4c34-a16891f84e7b(具有等效格式(。在索引6和8(0x30而不是0x70,0x8c而不是0x4c(处发现了由于字节操作引起的差异。

最新更新