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

时间:2018-02-09 12:17:09

标签: node.js random cryptojs

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

pattern

如何在nodejs中生成不包含给定['a', '2']的安全随机字符。 例如:14cf777d3cr307f5e78496,它应返回没有给定模式 /** * sends the user a new password * * @Route("reset_password/{id}", name="user_reset_password") * @Security("has_role('ROLE_ADMIN')") * * @param User $user * @return \Symfony\Component\HttpFoundation\RedirectResponse */ public function resetPassworAction(User $user) { if (null === $user->getConfirmationToken()) { /** @var $tokenGenerator TokenGeneratorInterface */ $tokenGenerator = $this->get('fos_user.util.token_generator'); $user->setConfirmationToken($tokenGenerator->generateToken()); } $this->get('fos_user.mailer')->sendResettingEmailMessage($user); $user->setPasswordRequestedAt(new \DateTime()); $this->get('fos_user.user_manager')->updateUser($user); $this->addFlash('notice', "User {$user->getFullName()} got an email for resetting his password!"); return $this->redirectToRoute('user_index'); }

的安全字符

1 个答案:

答案 0 :(得分:1)

crypto module并不能直接提供您所需要的内容。 虽然,你可以做的是,保持递归生成加密,直到内部找不到任何模式。

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

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数组中提供的任何字符串的函数。

如果您对某种性能影响感到担心,则无需担心。

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

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

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

我平均有4到8个函数执行。