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

欢迎!请查看关于页面了解此状态的更多相关信息。

0
ClojureScript

当前,{{random-uuid}} 使用 {{Math/random}} 通过 {{rand-int}} 来生成 v4 UUID 的随机数。此补丁旨在在可能的情况下使用密码学安全的 PRNG。

使用的函数包括
在 IE11 中使用 {{window.msCrypto.getRandomValues}}
在不支持前者或 Node.js 中未提供加密模块的浏览器中,使用 * {{Math/random}}

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

Google Closure 似乎不提供功能检测或加密-API 的包装器,所以附带的补丁建议实现一个基于功能检测的存根。

一个开放的问题是 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}}。

该补丁还使用了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.关于{{(exists? crypto)}}在node中我不能使用{{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中使用crypto库。
0

评论者:abp

对最近两天不好的补丁表示歉意,一直都很匆忙。
附加的0003-CLJS-2386-remove-node.patch 修复了 A. Rs 最新发现的问题。

0

评论者:abp

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

另一种可能的实现是将生成的随机数转换为普通数组,然后再在原地只对字符串进行{{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

加入了0007-CLJS-2386-fix-rand-array-len.patch,其中包含对{{random-uuid-vals}}中一个错误的修复,其中在{{crypto.getRandomValues}}不可用的情况下,生成的随机数不足。

0007-CLJS-2386-fix-rand-array-len.patch 也适用于最新的master版本

0

评论者:abp

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

0

评论者:mfikes

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

...