请分享您的想法在 2024 Clojure 状态调查!

欢迎!请查看 关于 页面以获取更多关于如何工作的信息。

0
ClojureScript

{{random-uuid}} 目前使用 {{Math/random}} 通过 {{rand-int}} 生成用于v4 UUID的随机数。此补丁旨在如果在可用的情况下,使用加密强的PRNG(伪随机数生成器)代替。

使用的功能有
{{window.crypto.getRandomValues}} 在大多数浏览器中
{{window.msCrypto.getRandomValues}} 在IE11中
* {{Math/random}} 在不支持前者或Node.js上没有提供crypto模块的浏览器中

目前未使用
* {{crypto.randomBytes}} 在Node.js中

Google Closure似乎没有提供功能检测或crypto-APIs包装器,因此附带的补丁提案基于功能检测实现了一个shim。

一个悬而未决的问题是Node.js {{crypto}} 模块应该如何提供,因为ClojureScripts {{core.cljs}}似乎没有条件{{require}} Node.js模块,并且可能应该保持这样。

17 答案

0

由:dnolen 发布的评论

一些初步反馈没有在target上切换,只是进行功能检测请。不要使用 js/window,使用 goog.global

0

由:aralo 发布的评论

我们应该使用 js-mod,因为 UInt8 数组保证了它们为正数?

可能超出范围之外,但我们可以通过手动使用 (.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}}对象。这偶然发生的,因为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}} 在 {{array}} 上而不是 {{str}}

一种替代实现可能是随机数生成后,将 {{Uint8ClampedArray}} 转换为常规数组,然后简单地 {{aset}} 字符串转换并 {{.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}} 中错误的修复的 0007-CLJS-2386-fix-rand-array-len.patch,其中在 {{crypto.getRandomValues}} 不可用时,生成的随机数不足。

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

0
by

评论者:abp

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

0
by

评论者:mfikes

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

...