2024 年 Clojure 状态调查!中分享你的想法。

欢迎!请查阅关于页面以了解更多有关该功能的信息。

0
ClojureScript

{{random-uuid}} 当前使用 {{Math/random}} via {{rand-int}} 生成 v4 UUID 的随机数。此补丁旨在在可用的情况下使用密码学安全的 PRNG(伪随机数生成器)。

使用的函数有
大多数浏览器中的 {{window.crypto.getRandomValues}}
IE11 中的 {{window.msCrypto.getRandomValues}}
* 不支持上述的浏览器或 Node.js 上不可用 crypto 模块时使用的 {{Math/random}}

目前未使用
* Node.js 上的 {{crypto.randomBytes}}

Google Closure 似乎不提供功能检测或用于 crypto-APIs 的包装器,因此附件的补丁建议基于功能检测实现了一个 shimming。

一个悬而未决的问题是 Node.js 的 {{crypto}} 模块如何使可用,因为 ClojureScripts 的 {{core.cljs}} 似乎没有有条件的 {{require}} Node.js 模块,也许应该保持这种状态。

17 答案

0

评论人:dnolen

一些初步反馈不切换目标,仅做功能检测。请勿使用 js/window,使用 goog.global

0

评论人:aralo

我们应该使用 js-mod 由于 UInt8 数组保证了它们是正数?

可能超出范围,但为了提高速度,而不是使用 str,我们可以手动使用 (.join ... "")(.join ... "-")

0

评论者:abp

添加了0001-CLJS-2386-no-target-js-mod.patch,该补丁根据David的评论删除了* }切换,并将{{js/window}}替换为{{goog.global}}。

此补丁还像A.R.建议的那样使用{{js-mod}}而不是{{mod}},并为{{random-uuid}}添加了说明行为的文档字符串。
我也可以实现{{.join}}建议,但现在还没有。

已更新工单描述以反映当前状态。

0

评论人:aralo

@Adrian:不要使用{{goog.global.window}},因为{{goog.global}}已经是浏览器中的{{window}}对象。这会生效,因为窗口对象也保持对自己本身的引用,所以你可以写{{js/window.window.window.window.crypto}}。目前你的代码在nodejs上无法工作。

所以请只使用{{goog.global.crypto}},并根据你之前的方法使用{{js/Uint8ClampedArray}}。

@David:我们可能在{{js-in}}宏周围添加一个{{bool-expr}},然后我们可以将其用于功能检测代码。

0

评论者:abp

哦,那个查找/替换出错,甚至不是故意为之,按照你解释的原因测试成功,将进行修复。

0
_评论者:abp_

0002-CLJS-2386-remove-window.patch修复了A.R.指出的问题,{{.join}}重构仍被推迟。

@A.R.关于node上的{{(exists? crypto)}},我不能使用{{goog.global}},因为它是一个模块,对吧?感谢帮助/审阅!
0
_评论者:aralo_

1. 没有必要检查{{goog.global}},它将存在。
2. 你检查{{goog.global.msCrypto.getRandomValues}},但随后调用{{goog.global.crypto.getRandomValues}}。
3. 你不能这样检查{{(exists? crypto) ;; nodejs}},对于Node模块。crypto必须解析为某些内容。因此,现在先省略这个{{nodejs}}情况。除非David能给出有关如何在Node中条件性引入加密库的更好建议。
0

评论者:abp

对于最近两天不好的补丁,总是急匆匆的。
附加的0003-CLJS-2386-remove-node.patch修复了A. Rs的最新发现。

0

评论者:abp

附加的0004-CLJS-2386-join-array.patch在数组上使用{{.join}}而不是{{str}}。

另一种实现方法可能在生成随机数后将{{Uint8ClampedArray}}转换为常规数组,然后直接在目标位置进行字符串转换并进行{{.join}}操作。但我不确定这会不会更有效率,也不知道如何将类型化数组转换为常规数组。

0

评论者:abp

0005-CLJS-2386-join-aset.patch应该更高效,因为它不是使用闭包从类型数组访问随机值。它只是生成带随机值的无/类型数组,然后转换并发送到无类型数组以进行{{.join}}。

0

评论者:abp

0006-CLJS-2386-fix-join-aset.patch修复了0005-CLJS-2386-join-aset.patch中的错误,并取代了它。

0

评论者:mfikes

0006-CLJS-2386-fix-join-aset.patch不再适用。

0

评论者:abp

添加了包含在{{random-uuid-vals}}中的一个修复程序,其中在{{crypto.getRandomValues}}不可用时,生成的随机数不足的0007-CLJS-2386-fix-rand-array-len.patch。

0007-CLJS-2386-fix-rand-array-len.patch也适用于最新主分支。

0

评论者:abp

添加了0008-CLJS-2386-fix-ie.patch以移除对{{Uint8ClampedArray}}的使用,这会导致IE11在{{msCrypto.getRandomValues}}中抛出{{TypeMismatchError}}。还从其他浏览器的实现中移除了{{Uint8ClampedArray}},因为它不是必需的。

0

评论者:mfikes

0008-CLJS-2386-fix-ie.patch通过CI测试(/)

...