首页 > 解决方案 > Passay生成密码不重复字符

问题描述

目前,我正在使用 passay 生成随机密码。

new PasswordGenerator().generatePassword(8,
  Arrays.asList(
  new CharacterRule( EnglishCharacterData.UpperCase, 2 ),
  new CharacterRule( EnglishCharacterData.LowerCase, 2 ),
  new CharacterRule( EnglishCharacterData.Digit, 2 ),
  new CharacterRule( EnglishCharacterData.Special, 2 ) ) );

我可以知道如何生成随机密码而不重复任何字符吗?

Password: abcxyz12 //valid

Password: abcxyzpa // invalid because a is repeating

我正在使用 passay 生成密码

<dependency>
  <groupId>org.passay</groupId>
  <artifactId>passay</artifactId>
  <version>1.2.0</version>
</dependency>

标签: javapasswords

解决方案


查看源代码,您可以指定特定字符的最小数量,但不能指定最大数量。

所以我认为最简单的方法是使用这个库生成一个大密码,然后删除重复字符,然后限制你想要的长度:

StringBuilder sb = new StringBuilder();
generatePassword.chars()
        .distinct()
        .limit(8)
        .forEach(c -> sb.append((char) c));
System.out.println(sb.toString());

这可能效率有点低,所以如果性能很关键,我建议编写自己的生成器(我刚刚尝试过,创建一个并不难)。您可以在org.passay.EnglishCharacterData中找到字符集。


推荐阅读