我正在阅读有关在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');
}
答案 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个函数执行。