Security 在随机生成的密码中强制执行密码复杂性要求是否会使它们更安全?

Security 在随机生成的密码中强制执行密码复杂性要求是否会使它们更安全?,security,passwords,Security,Passwords,我遇到了一些代码,大致如下所示: function generatePassword() { let password; do { password = generateRandomString(); } while (!checkPasswordComplexity(password)); return password; } 假设generateRandomString()返回所需字符集的真正随机字符串,并且checkPasswordComplexity()检查密码

我遇到了一些代码,大致如下所示:

function generatePassword() {
  let password;
  do {
    password = generateRandomString();
  } while (!checkPasswordComplexity(password));
  return password;
}
假设
generateRandomString()
返回所需字符集的真正随机字符串,并且
checkPasswordComplexity()
检查密码是否包含一些预定义的最小大小写/数字/特殊字符数

基本上,它会尝试生成一个随机密码,检查某些复杂度要求,如果检查失败,它会再次尝试

第一个问题:

这实际上比仅从
generateRandomString
返回第一个结果更安全吗

第二个问题:


如果这实际上是一种良好的做法,那么有没有更有效(但仍然安全)的方法来直接生成满足复杂性要求的密码?

开始回答我自己的问题:

第一个问题:

一方面,密码破解者可能从不太复杂的候选密码开始。另一方面,如果破解者知道你的复杂度要求,这实际上是在减少搜索空间。实际上,我不知道哪个更好

第二个问题:


例如,如果需要长度为10的密码中包含2个特殊字符,则从特殊字符集中随机选取2个字符,然后将其放置在最终密码中的随机位置。然后用整个字符集中的随机字符填充剩余的8个位置。

开始回答我自己的问题:

第一个问题:

一方面,密码破解者可能从不太复杂的候选密码开始。另一方面,如果破解者知道你的复杂度要求,这实际上是在减少搜索空间。实际上,我不知道哪个更好

第二个问题:

例如,如果需要长度为10的密码中包含2个特殊字符,则从特殊字符集中随机选取2个字符,然后将其放置在最终密码中的随机位置。然后用整个字符集中的随机字符填充剩余的8个位置