标签分类
技术文章
当前位置:主页 > 计算机编程 > java > java实现的密码强度检测功能完整代码

java实现的密码强度检测功能的方法和代码

  • 发布时间:
  • 作者:码农之家原创
  • 点击:119

java实现的密码强度检测功能完整代码

这篇文章主要知识点是关于java,密码强度检测,java实现的密码强度检测功能完整代码,java实现仿射密码加密解密 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Effective Java
Effective Java中文第2版
  • 类型:java大小:56 MB格式:PDF出版:机械工业出版社作者:布洛克
立即下载

本文实例讲述了java实现的密码强度检测功能。分享给大家供大家参考,具体如下:

CheckStrength.java文件:

package com.wx.pwd;
/**
 * 检测密码强度
 *
 * @author venshine
 */
public class CheckStrength {
  public enum LEVEL {
    EASY, MIDIUM, STRONG, VERY_STRONG, EXTREMELY_STRONG
  }
  /**
   * NUM 数字
   * SMALL_LETTER 小写字母
   * CAPITAL_LETTER 大写字母
   * OTHER_CHAR 特殊字符
   */
  private static final int NUM = 1;
  private static final int SMALL_LETTER = 2;
  private static final int CAPITAL_LETTER = 3;
  private static final int OTHER_CHAR = 4;
  /**
   * 简单的密码字典
   */
  private final static String[] DICTIONARY = {"password", "abc123", "iloveyou", "adobe123", "123123", "sunshine",
      "1314520", "a1b2c3", "123qwe", "aaa111", "qweasd", "admin", "passwd"};
  /**
   *检查字符类型,包括num、大写字母、小写字母和其他字符。
   *
   * @param c
   * @return
   */
  private static int checkCharacterType(char c) {
    if (c >= 48 && c <= 57) {
      return NUM;
    }
    if (c >= 65 && c <= 90) {
      return CAPITAL_LETTER;
    }
    if (c >= 97 && c <= 122) {
      return SMALL_LETTER;
    }
    return OTHER_CHAR;
  }
  /**
   * 按不同类型计算密码的数量
   *
   * @param passwd
   * @param type
   * @return
   */
  private static int countLetter(String passwd, int type) {
    int count = 0;
    if (null != passwd && passwd.length() > 0) {
      for (char c : passwd.toCharArray()) {
        if (checkCharacterType(c) == type) {
          count++;
        }
      }
    }
    return count;
  }
  /**
   * 检查密码的强度
   *
   * @param passwd
   * @return strength level
   */
  public static int checkPasswordStrength(String passwd) {
    if (StringUtils.equalsNull(passwd)) {
      throw new IllegalArgumentException("password is empty");
    }
    int len = passwd.length();
    int level = 0;
    // 增加点
    //判断密码是否含有数字有level++
    if (countLetter(passwd, NUM) > 0) {
      level++;
    }
    //判断密码是否含有小写字母有level++
    if (countLetter(passwd, SMALL_LETTER) > 0) {
      level++;
    }
    //判断密码是否还有大写字母有level++
    if (len > 4 && countLetter(passwd, CAPITAL_LETTER) > 0) {
      level++;
    }
    //判断密码是否还有特殊字符有level++
    if (len > 6 && countLetter(passwd, OTHER_CHAR) > 0) {
      level++;
    }
    //密码长度大于4并且2种类型组合......(不一一概述)
    if (len > 4 && countLetter(passwd, NUM) > 0 && countLetter(passwd, SMALL_LETTER) > 0
        || countLetter(passwd, NUM) > 0 && countLetter(passwd, CAPITAL_LETTER) > 0
        || countLetter(passwd, NUM) > 0 && countLetter(passwd, OTHER_CHAR) > 0
        || countLetter(passwd, SMALL_LETTER) > 0 && countLetter(passwd, CAPITAL_LETTER) > 0
        || countLetter(passwd, SMALL_LETTER) > 0 && countLetter(passwd, OTHER_CHAR) > 0
        || countLetter(passwd, CAPITAL_LETTER) > 0 && countLetter(passwd, OTHER_CHAR) > 0) {
      level++;
    }
    //密码长度大于6并且3中类型组合......(不一一概述)
    if (len > 6 && countLetter(passwd, NUM) > 0 && countLetter(passwd, SMALL_LETTER) > 0
        && countLetter(passwd, CAPITAL_LETTER) > 0 || countLetter(passwd, NUM) > 0
        && countLetter(passwd, SMALL_LETTER) > 0 && countLetter(passwd, OTHER_CHAR) > 0
        || countLetter(passwd, NUM) > 0 && countLetter(passwd, CAPITAL_LETTER) > 0
        && countLetter(passwd, OTHER_CHAR) > 0 || countLetter(passwd, SMALL_LETTER) > 0
        && countLetter(passwd, CAPITAL_LETTER) > 0 && countLetter(passwd, OTHER_CHAR) > 0) {
      level++;
    }
    //密码长度大于8并且4种类型组合......(不一一概述)
    if (len > 8 && countLetter(passwd, NUM) > 0 && countLetter(passwd, SMALL_LETTER) > 0
        && countLetter(passwd, CAPITAL_LETTER) > 0 && countLetter(passwd, OTHER_CHAR) > 0) {
      level++;
    }
    //密码长度大于6并且2种类型组合每种类型长度大于等于3或者2......(不一一概述)
    if (len > 6 && countLetter(passwd, NUM) >= 3 && countLetter(passwd, SMALL_LETTER) >= 3
        || countLetter(passwd, NUM) >= 3 && countLetter(passwd, CAPITAL_LETTER) >= 3
        || countLetter(passwd, NUM) >= 3 && countLetter(passwd, OTHER_CHAR) >= 2
        || countLetter(passwd, SMALL_LETTER) >= 3 && countLetter(passwd, CAPITAL_LETTER) >= 3
        || countLetter(passwd, SMALL_LETTER) >= 3 && countLetter(passwd, OTHER_CHAR) >= 2
        || countLetter(passwd, CAPITAL_LETTER) >= 3 && countLetter(passwd, OTHER_CHAR) >= 2) {
      level++;
    }
    //密码长度大于8并且3种类型组合每种类型长度大于等于3或者2......(不一一概述)
    if (len > 8 && countLetter(passwd, NUM) >= 2 && countLetter(passwd, SMALL_LETTER) >= 2
        && countLetter(passwd, CAPITAL_LETTER) >= 2 || countLetter(passwd, NUM) >= 2
        && countLetter(passwd, SMALL_LETTER) >= 2 && countLetter(passwd, OTHER_CHAR) >= 2
        || countLetter(passwd, NUM) >= 2 && countLetter(passwd, CAPITAL_LETTER) >= 2
        && countLetter(passwd, OTHER_CHAR) >= 2 || countLetter(passwd, SMALL_LETTER) >= 2
        && countLetter(passwd, CAPITAL_LETTER) >= 2 && countLetter(passwd, OTHER_CHAR) >= 2) {
      level++;
    }
    //密码长度大于10并且4种类型组合每种类型长度大于等于2......(不一一概述)
    if (len > 10 && countLetter(passwd, NUM) >= 2 && countLetter(passwd, SMALL_LETTER) >= 2
        && countLetter(passwd, CAPITAL_LETTER) >= 2 && countLetter(passwd, OTHER_CHAR) >= 2) {
      level++;
    }
    //特殊字符>=3 level++;
    if (countLetter(passwd, OTHER_CHAR) >= 3) {
      level++;
    }
    //特殊字符>=6 level++;
    if (countLetter(passwd, OTHER_CHAR) >= 6) {
      level++;
    }
    //长度>12 >16 level++
    if (len > 12) {
      level++;
      if (len >= 16) {
        level++;
      }
    }
    // 减少点
    if ("abcdefghijklmnopqrstuvwxyz".indexOf(passwd) > 0 || "ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(passwd) > 0) {
      level--;
    }
    if ("qwertyuiop".indexOf(passwd) > 0 || "asdfghjkl".indexOf(passwd) > 0 || "zxcvbnm".indexOf(passwd) > 0) {
      level--;
    }
    if (StringUtils.isNumeric(passwd) && ("01234567890".indexOf(passwd) > 0 || "09876543210".indexOf(passwd) > 0)) {
      level--;
    }
    if (countLetter(passwd, NUM) == len || countLetter(passwd, SMALL_LETTER) == len
        || countLetter(passwd, CAPITAL_LETTER) == len) {
      level--;
    }
    if (len % 2 == 0) { // aaabbb
      String part1 = passwd.substring(0, len / 2);
      String part2 = passwd.substring(len / 2);
      if (part1.equals(part2)) {
        level--;
      }
      if (StringUtils.isCharEqual(part1) && StringUtils.isCharEqual(part2)) {
        level--;
      }
    }
    if (len % 3 == 0) { // ababab
      String part1 = passwd.substring(0, len / 3);
      String part2 = passwd.substring(len / 3, len / 3 * 2);
      String part3 = passwd.substring(len / 3 * 2);
      if (part1.equals(part2) && part2.equals(part3)) {
        level--;
      }
    }
    if (StringUtils.isNumeric(passwd) && len >= 6) { // 19881010 or 881010
      int year = 0;
      if (len == 8 || len == 6) {
        year = Integer.parseInt(passwd.substring(0, len - 4));
      }
      int size = StringUtils.sizeOfInt(year);
      int month = Integer.parseInt(passwd.substring(size, size + 2));
      int day = Integer.parseInt(passwd.substring(size + 2, len));
      if (year >= 1950 && year < 2050 && month >= 1 && month <= 12 && day >= 1 && day <= 31) {
        level--;
      }
    }
    if (null != DICTIONARY && DICTIONARY.length > 0) {// dictionary
      for (int i = 0; i < DICTIONARY.length; i++) {
        if (passwd.equals(DICTIONARY[i]) || DICTIONARY[i].indexOf(passwd) >= 0) {
          level--;
          break;
        }
      }
    }
    if (len <= 6) {
      level--;
      if (len <= 4) {
        level--;
        if (len <= 3) {
          level = 0;
        }
      }
    }
    if (StringUtils.isCharEqual(passwd)) {
      level = 0;
    }
    if (level < 0) {
      level = 0;
    }
    return level;
  }
  /**
   *获得密码强度等级,包括简单、复杂、强、强、强
   *
   * @param passwd
   * @return
   */
  public static LEVEL getPasswordLevel(String passwd) {
    int level = checkPasswordStrength(passwd);
    switch (level) {
      case 0:
      case 1:
      case 2:
      case 3:
        return LEVEL.EASY;
      case 4:
      case 5:
      case 6:
        return LEVEL.MIDIUM;
      case 7:
      case 8:
      case 9:
        return LEVEL.STRONG;
      case 10:
      case 11:
      case 12:
        return LEVEL.VERY_STRONG;
      default:
        return LEVEL.EXTREMELY_STRONG;
    }
  }
}

StringUtils.java文件:

package com.wx.pwd;
/**
 * 字符串工具类
 *
 * @author venshine
 */
public class StringUtils {
  private final static int[] SIZE_TABLE = {9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999,
      Integer.MAX_VALUE};
  /**
   * 计算一个整数的大小
   *
   * @param x
   * @return
   */
  public static int sizeOfInt(int x) {
    for (int i = 0; ; i++)
      if (x <= SIZE_TABLE[i]) {
        return i + 1;
      }
  }
  /**
   * 判断字符串的每个字符是否相等
   *
   * @param str
   * @return
   */
  public static boolean isCharEqual(String str) {
    return str.replace(str.charAt(0), ' ').trim().length() == 0;
  }
  /**
   * 确定字符串是否为数字
   *
   * @param str
   * @return
   */
  public static boolean isNumeric(String str) {
    for (int i = str.length(); --i >= 0; ) {
      if (!Character.isDigit(str.charAt(i))) {
        return false;
      }
    }
    return true;
  }
  /**
   * 判断字符串是否为空格、空(“)”或null。
   *
   * @param str
   * @return
   */
  public static boolean equalsNull(String str) {
    int strLen;
    if (str == null || (strLen = str.length()) == 0 || str.equalsIgnoreCase("null")) {
      return true;
    }
    for (int i = 0; i < strLen; i++) {
      if ((Character.isWhitespace(str.charAt(i)) == false)) {
        return false;
      }
    }
    return true;
  }
}

CheckPWD.java文件:

package com.wx.pwd;
public class CheckPWD {
 public static void main(String[] args) {
    String passwd = "myNameJOB123_-+=";
    System.out.println(CheckStrength.checkPasswordStrength(passwd));
    System.out.println(CheckStrength.getPasswordLevel(passwd));
  }
}

运行结果:

13
EXTREMELY_STRONG

 

java实现仿射密码加密解密

本文实例为大家分享了java实现仿射密码加密解密的具体代码,供大家参考,具体内容如下

加密:将明文转化为对应的数字,如 ‘a'-> 0, ‘b'->1,…,'1'->26,'2'->27,…然后将数字进行仿射运算,求取出来的数字再转化为字符。即 密文=(K1*明文+K2)mod36

解密:密文转化为对应数字,然后进行仿射的逆运算,得到对应数字,然后将其转化为字符明文。解密 K3是K1的乘法逆元

import java.util.Scanner;

public class Affine{
 public static void main(String[] args) {
  char[] form = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
    'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0'
    , '1', '2', '3', '4', '5', '6', '7', '8', '9'};
  Scanner sc = new Scanner(System.in);
  System.out.println("请输入待加密的明文:");
  String MingWen = sc.nextLine();
  MingWen=MingWen.toUpperCase();//将输入的明文全部大写
  final int K1 = 103;
  final int K2 = 103;
  final int K3 = 31;
  int [] cipherNum=new int[MingWen.length()];//用来存储数字化的密文
  encryption(MingWen,form,K1,K2,cipherNum);
  decryption(form,MingWen,K2,K3,cipherNum);

 }
 public static void encryption(String MingWen,char[] form,int K1,int K2,int[] cipherNum){
  //第一步:将明文存入数组
  char[] pla=new char[MingWen.length()];
  for (int i = 0; i <MingWen.length() ; i++) {
   pla[i]=MingWen.charAt(i);
  }//已将明文存入字符数组pla中
  //第二步:通过脚标找到明文中每个字符对应的数,参与加密运算
  int[] MingWenNumber=new int[pla.length];
  for (int i = 0; i <pla.length ; i++) {
   for (int j = 0; j <form.length ; j++) {
    if (form[j]==pla[i]) {
     MingWenNumber[i] = j;
    }
   }
  }
  //通过脚标将明文全部转化为数字
  char[] cipher = new char[MingWen.length()];//cipher密码数组 用来存储密文
  for (int i = 0; i <MingWen.length() ; i++) {
   int a= Math.floorMod((K1*MingWenNumber[i]+K2),36);
   cipherNum[i]=a;
   cipher[i]=form[a];
   //计算密文并存入数组中
  }
  System.out.println("加密结果是:");
  System.out.println(cipher);
 }

 public static void decryption(char[] form,String Mingwen,int K2,int K3,int[] cipherNum){
  char[] JieMI=new char[Mingwen.length()];
  for (int i =0;i<Mingwen.length();i++){
   JieMI[i]=form[Math.floorMod(K3*(cipherNum[i]-K2),36)];
  }
  System.out.println("解密结果是:");
  System.out.println(JieMI);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到等java文章进一步学习,感谢大家的阅读和支持。

上一篇:SpringBoot中启动Tomcat的步骤流程

下一篇:scala操作数据库的方法实例

展开 +

收起 -

学习笔记
网友NO.868246

JavaScript实现淘宝京东6位数字支付密码效果

京东淘宝的密码输入框功能点 只能输入数字 只能输入6位字符 每次输入一个字符,对应位置的小黑点显示 每次删除一个字符,对应位置的小黑点消失 实现思路 1、写好6位密码输入框的静态样式和html结构 2、将密码输入框input定位到父容器,覆盖之前写好的6位密码输入框区域,并设置为透明 3、虽然设置了密码输入框为透明,但当密码输入框获得焦点的时候,输入框的光标会显示出来,并不是透明状态。为了解决这个问题,暂时想到了两种方法,第一种,利用css将光标也设置为透明,不过这种方法有一定的兼容问题;第二种,当输入框获得焦点的时候,将输入框定位到屏幕外面,用户看不到输入框,自然也就看不到光标在那里一闪一闪了。 4、对于用户只能输入数字的功能,这里用正则表达式就搞定了,如果用户输入了非数字字符,将input输入框的值清空 5、对于用户输入超过6位字符的情况,利用字符串的截取方法截取input.value的前6位字符 6、循环遍历圆点,将index小于input.value.length的圆点显示出来 7、用户输入超过6个的数字的时候,你再去删除,你会发现要删除很多字符,那些小圆点才会相应的消失,所以这里,将截取的6位字符赋值给input输入框的值,让input.value长度永远小于等于6 HTML结构 父容器 input-ps 用于input输入框的……

网友NO.381085

利用JavaScript缓存远程窃取Wi-Fi密码的思路详解

我一直想在这个小项目上花一些时间做一些研究,但是由于生活所迫让我总是一直繁忙。现在我终于可以抽出一些时间了继续研究这种攻击技术了,我将在本文中阐述我的研究成果。 很久以前,我学习了Vivek Ramachandran讲解的“无线局域网安全Megaprimer课程”(课程非常好,强烈推荐),顺便说一下,在我做旅行的时候,我住的那些不同的酒店都会提供Wi-Fi。毋庸置疑,我的大脑开始变得疯狂,因此我一直在思考获取Wi-Fi密码的“非常规”的方法。 Can't turn my brain off, you know.
It's me. We go into some place,
and all I can do is see the angles.
– Danny Ocean (Ocean's Twelve) 我即将描述的想法非常简单,可能也不是什么新的思路了。尽管如此,对我来说这是一种有趣的方式,让我将放在架子上一直吃灰的Raspberry Pi重新用了起来。 思路描述 我们的想法是利用网络浏览器的缓存来窃取Wi-Fi密码。因为我需要为项目起一个名字,所以我在开发完这个项目后将其命名为“Dribble”:-)。Dribble 会创建一个虚假的Wi-Fi接入点,并等待客户端连接它。当客户端连接时,dribble会拦截对JavaScript页面执行的每个HTTP请求,并在响应中注入恶意JavaScript代码。新响应的HTTP头也会被更改,以便恶意的JavaScript代码被缓存并强制在浏览器中保留。当客户端与虚假接入点断开连接……

网友NO.560244

Java实现邮件找回密码功能

本文实例为大家分享了Java实现邮件找回密码功能的具体代码,供大家参考,具体内容如下 1、有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回。通过java发送邮件的功能我就不说了,重点讲找回密码。 2、参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点 就是如何生成这个url和如何解析这个url. 需要注意 的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 3、加密能防止伪造攻击,一次url只能验证一次,并且绑定了用户。生成url: 可以用UUID生成随机密钥。 数字签名 = MD5(用户名+'$'+过期时间+‘$'+密钥key) 数据库字段(用户名(主键),密钥key,过期时间) url参数(用户名,数字签名) ,密钥key的生成:在每一个用户找回密码时候为这个用户生成一个密钥key , url example: http://localhost:8080/user/reset_password?sid=D622D6A23FBF86FFE696B593D55351A54AEAEA77 Map map = newHashMapString ,String (); String msg = ""; if(users == null){ //用户名不存在 msg = "用户名不存在,你不会忘记用户名了吧?"; map.put("msg",msg); returnmap; } try{ String secretKey= UUID.randomUUID().toString(); //密钥 Timestamp outDate = newTimestamp(System.currentTimeMillis()……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明