Nodejs 生成不包括给定字符的安全随机字符

Nodejs generate secure random characters not including given chars

我正在阅读有关在 nodejs 中生成安全随机生成器的内容。 我尝试了这个并且可以很好地生成安全的随机字符。

const crypto = require('crypto');

var length = 22
var generated = crypto.randomBytes(Math.ceil(length / 2))
                      .toString('hex').slice(0, length);
//it returned "14cf777d3ca307f5e78496"

如何在 nodejs 中生成不包括给定 pattern 的安全随机字符。 例如:['a', '2'],它应该 return 保护没有给定模式的字符 14cf777d3cr307f5e78496

crypto module 不直接提供您要查找的内容。 虽然,您可以做的是继续递归生成您的密码,直到在内部找到 none 个模式。

为此,您可以使用以下内容:

async function generateRandomCrypto(length, patterns) {
    const generated = await crypto.randomBytes(Math.ceil(length / 2)).toString('hex').slice(0, length);

    let isValid = true;
    for (pattern of patterns) {
        if (generated.indexOf(pattern) !== -1) {
            isValid = false;
            break;
        }
    }

    if (!isValid) {
        return await generateRandomCrypto(length, patterns);
    }

    return generated;  
}

现在,该函数将继续生成,直到它找到一个不包含 patterns 数组中提供的任何字符串的字符串。

如果您担心任何类型的性能影响 - 没有必要。

假设您的模式不是单字母字符串,它们出现在 运行dom 序列中的可能性很小 - 因此,生成可能 运行 一次。

并且即使,我也为你做了一个测试 - 我运行这个模式数组看起来像这样:

const patterns = ['a', 'b'];

我平均执行了 4 - 8 次函数。