首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >邮递员CryptoJS替代CryptoJS

邮递员CryptoJS替代CryptoJS
EN

Stack Overflow用户
提问于 2022-10-21 19:21:50
回答 1查看 102关注 0票数 2

我试图从一个字符串生成一个UUID,我基本上想要重新创建UUID.nameUUIDFromBytes在Java中所做的事情。我发现这篇文章在postman之外工作得很好,它是用UUID.nameUUIDFromBytes编写的JavaScript?-堆栈溢出

但是邮递员没有密码。我还在邮递员中尝试过CryptoJS,并且非常接近,生成的UUID是由一个字符…关闭的

代码语言:javascript
复制
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博客中添加外部库

代码语言:javascript
复制
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’)”

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-23 11:14:04

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

CryptoJS内部使用WordArray类型,即由4字节单词(s. 这里)组成的数组。此类型也由CryptoJS.MD5()返回。由于MD5输出大小为16字节,所以WordArray由4个字(4个字节)组成。

由于UUID算法修改单个字节,因此有必要访问和修改单词中的字节。这是可行的,例如将WordArray转换为Uint8Array,反之亦然:

代码语言:javascript
复制
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)
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

更有效的是MD5实现,它将哈希作为字节数组(ArrayArrayBufferUint8Array)返回,以便可以直接访问字节,例如https://github.com/emn178/js-md5

代码语言:javascript
复制
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)
代码语言:javascript
复制
<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的十六进制编码的12345哈希是827ccb0e-ea8a-706c-4c34-a16891f84e7b (具有等效格式)。在索引6和8 (0x30代替0x70和0x8c而不是0x4c)中发现了由于字节操作而产生的差异。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74158326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档