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

欢迎!有关本网站的更多信息,请参阅 关于 页面。

0 投票
ClojureScript

{{random-uuid}} 目前通过 {{Math/random}} 和 {{rand-int}} 使用 {{Math/random}} 在大多数浏览器中生成随机数,用于 v4 UUID。此补丁旨在在可用的情况下使用加密强度强的 PRNG (伪随机数生成器)。

所使用的函数包括
{{window.crypto.getRandomValues}} 在大多数浏览器中
{{window.msCrypto.getRandomValues}} 在 IE11 中
* {{Math/random}} 在不支持前者的浏览器或 Node.js 上的加密模块不可用的情况下

当前未使用
* {{crypto.randomBytes}} 在 Node.js 上

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

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

17 个答案

0 投票

由 dnolen 制作的评论

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

0 投票

由 aralo 制作的评论

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

可能超出范围,但我们可以通过手动使用 (.join ... "")(.join ... "-") 而不是 str 来提高一些速度。

0 投票

评论者:abp

添加了0001-CLJS-2386-no-target-js-mod.patch,该补丁删除了* } 开关,并如David评论所说,用{{js/window}}替换了{{goog.global}}。

该补丁还使用{{js-mod}}代替了A.R.建议的{{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}}转换为普通数组,然后在原位执行字符串转换,并{{.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 (/)

...