How can I create a password?

前端 未结 10 1769
悲&欢浪女
悲&欢浪女 2020-12-14 04:37

I want to give maybe a million password to some users that should be like:

  1. It must have at least 6 characters
  2. It must have digits and also letters
10条回答
  •  余生分开走
    2020-12-14 05:13

    Implemented a PasswordBuilder. Supports passwrod limit, must have characters and how much of them, char ranges and a list of them.

    Usage Example:

    System.out.println(new PasswordBuilder().addCharsOption("!@#$%&*()_-+=[]{}\\|:/?.,><", 1).addRangeOption('A', 'Z', 1).addRangeOption('a', 'z', 0).addRangeOption('0', '9', 1).build());
    

    Example result: QU1GY7p+j+-PUW+_

    System.out.println(new PasswordBuilder().addCharsOption("!@#$%&*()_-+=[]{}\\|:/?.,><", 1).addRangeOption('A', 'Z', 1).addRangeOption('a', 'z', 0).addRangeOption('0', '9', 1).setSize(5).build());
    

    Example result: %,4NX

    Implementation:

    //Version=1.0
    //Source=https://www.dropbox.com/s/3a4uyrd2kcqdo28/PasswordBuilder.java?dl=0
    //Dependencies=java:7 com.google.guava:guava:18.0 commons-lang:commons-lang:2.6
    
    import com.google.common.primitives.Chars;
    import org.apache.commons.lang.ArrayUtils;
    
    import java.security.SecureRandom;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created by alik on 5/26/16.
     */
    public class PasswordBuilder {
        private int size = 16;
        private List options = new ArrayList<>();
        private Map, Integer> musts = new java.util.LinkedHashMap<>();
        private SecureRandom secureRandom = new SecureRandom();
    
        public PasswordBuilder() {
        }
    
        public PasswordBuilder setSize(int size) {
            this.size = size;
            return this;
        }
    
        public PasswordBuilder addRangeOption(char from, char to, int mustCount) {
            List option = new ArrayList<>(to - from + 1);
            for (char i = from; i < to; ++i) {
                option.add(i);
            }
            return addOption(option, mustCount);
        }
    
        public PasswordBuilder addCharsOption(String chars, int mustCount) {
                return addOption(Chars.asList(chars.toCharArray()), mustCount);
        }
    
        public PasswordBuilder addOption(List option, int mustCount) {
            this.options.addAll(option);
            musts.put(option, mustCount);
            return this;
    
        }
    
        public String build() {
            validateMustsNotOverflowsSize();
            Character[] password = new Character[size];
    
            // Generate random from musts
            for (Map.Entry, Integer> entry : musts.entrySet()) {
                for (int i = 0; i < entry.getValue(); i++) {
                    int charIndex = secureRandom.nextInt(entry.getKey().size());
                    char c = entry.getKey().get(charIndex);
                    addChar(password, c);
                }
            }
    
            // Generate from overall
            for (int i = 0; i < password.length; i++) {
                if (password[i] != null) continue;
                password[i] = options.get(secureRandom.nextInt(options.size()));
            }
            return new String(ArrayUtils.toPrimitive(password));
        }
    
        private void addChar(Character[] password, char c) {
            int i;
            for (i = secureRandom.nextInt(password.length); password[i] != null; i = secureRandom.nextInt(password.length)) {
            }
            password[i] = c;
        }
    
        private void validateMustsNotOverflowsSize() {
            int overallMusts = 0;
            for (Integer mustCount : musts.values()) {
                overallMusts += mustCount;
            }
            if (overallMusts > size) {
                throw new RuntimeException("Overall musts exceeds the requested size of the password.");
            }
        }
    
        public static void main(String[] args) {
            System.out.println(new PasswordBuilder().addCharsOption("!@#$%&*()_-+=[]{}\\|:/?.,><", 1).addRangeOption('A', 'Z', 1).addRangeOption('a', 'z', 0).addRangeOption('0', '9', 1).build());
            System.out.println(new PasswordBuilder().addCharsOption("!@#$%&*()_-+=[]{}\\|:/?.,><", 1).addRangeOption('A', 'Z', 1).addRangeOption('a', 'z', 0).addRangeOption('0', '9', 1).setSize(5).build());
        }
    }
    

提交回复
热议问题