我们如何在 Rhino JS 中生成 32 字节的随机盐

How can we generate Random Salt of 32 bytes in Rhino JS

我正在尝试生成一个 32 字节大小的随机盐。但是我的 JS 引擎 Rhino 1.7.13 不支持 SecureRandom class.

下面是相同的代码片段。

function getSalt() {
    var random = new SecureRandom();
    var salt1 = new Array(32);
    random.nextBytes(salt1);
    return salt1;
}

错误记录如下。

java.util.concurrent.ExecutionException: javax.script.ScriptException: ReferenceError: "SecureRandom" is not defined.

此外,rhino js 引擎不允许任何外部库的导入或加载。有没有办法在 Rhino 中生成安全的随机盐?

对于 SecureRandom 使用完全限定名称 java.security.SecureRandom。 字节数组必须是 Java 字节数组,否则会报错:

Cannot convert org.mozilla.javascript.NativeArray@6b419da to byte[]

我从 Tomasz Gawel 那里找到了 this answer,它展示了如何在 Rhino 中创建 Java 字节数组。

经过above-mentioned修改后,完整的脚本为:

function getSalt() {
    var random = new java.security.SecureRandom();
    var salt1 = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 32)
    random.nextBytes(salt1);
    return salt1;
}

saltB64 = java.lang.String(java.util.Base64.getEncoder().encode(getSalt()))
print(saltB64)