【问题标题】:How to create a Java program to check if your password is strong or not?如何创建一个 Java 程序来检查您的密码是否强?
【发布时间】:2016-05-26 07:22:39
【问题描述】:

我希望程序做两件事:

  1. 检查字符串(密码输入)是否同时包含字母和数字。
  2. 检查密码是否至少包含 8 个字符。

这是我的代码:

import java.util.*;
class howstrong
{
  public static void main(String ar[])
  {
    String password;
    int i;
    int c=0;
    Scanner in = new Scanner(System.in);
    System.out.println("ENTER PASSWORD");
    password = in.next();
    if (password.length() <= 8)
    {
      for (i = 0; i <= password.length(); i++)
      {
        char x = password.charAt(i);
        if (Character.isLetter(x))
        {
          if (Character.isDigit(x))
          c = 1;
        }
      }
      if (c == 1)
        System.out.println("STRONG");
      else 
        System.out.println("NOT STRONG");
    }
    else
      System.out.println("HAVE AT LEAST 8 CHARACTERS");
  }
}

【问题讨论】:

  • 格式化!请看代码!
  • 您有具体的问题或错误吗?
  • @AndrewMortimer 第一个问题是当我输入超过 8 个字符的密码时,它给了我:字符串索引超出范围错误并且通常没有 8 个字符的限制语句,它总是给我不强的输出。
  • 将循环条件 i = 0; i &lt;= password.length(); i++ 替换为:i = 0; i &lt; password.length(); i++。对于最后一次迭代,您会得到一个 IndexOutofBoundException。 Password.charAt(password.length()) 不是有效索引。
  • @DavidSN 谢谢。现在检查 String 是否有 8 个字符正在工作。仍然坚持第一个条件(见问题)。

标签: java passwords


【解决方案1】:

你有几个问题:

i &lt;= password.length() 应该是i &lt; password.length()

if (password.length() &lt;= 8) 应该是if (password.length() &gt;= 8)

您正在检查字符是否同时是字母和数字。

最后,我建议使用两个标志,一个检测是否有字母,另一个检测是否有数字。

把它们放在一起:

import java.util.Scanner;

class howstrong {
    public static void main(final String ar[]) {
        String password;
        Scanner in = new Scanner(System.in);
        System.out.println("ENTER PASSWORD");
        password = in.next();

        boolean hasLetter = false;
        boolean hasDigit = false;

        if (password.length() >= 8) {
            for (int i = 0; i < password.length(); i++) {
                char x = password.charAt(i);
                if (Character.isLetter(x)) {

                    hasLetter = true;
                }

                else if (Character.isDigit(x)) {

                    hasDigit = true;
                }

                // no need to check further, break the loop
                if(hasLetter && hasDigit){

                    break;
                }

            }
            if (hasLetter && hasDigit) {
                System.out.println("STRONG");
            } else {
                System.out.println("NOT STRONG");
            }
        } else {
            System.out.println("HAVE AT LEAST 8 CHARACTERS");
        }
    }
}

【讨论】:

  • 非常感谢您的回答。我使用 c=1 作为标志,但它并没有像 Julien Lopez 指出的那样工作。感谢您的回答!
【解决方案2】:

有一个正则表达式可用于检查密码强度。您可以添加一个验证方法来检查密码是否与表达式匹配: 因此,您可以像这样在代码中调用该方法:

   password = in.next();

   if(isStrong(password){
      //good password, do stuff
    }
   else{
        //not so good, prompt again
   }

方法如下:

private boolean isStrong(String password){
    return password.matches("^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z])");

  }

下面是一个可用于检查密码强度的正则表达式。

^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$

您可以查看原帖和选择的答案here

【讨论】:

    【解决方案3】:

    在你的循环中,你检查你的角色是否是一个字母一个数字。所以c永远不会被设置为1。我建议你学习使用调试器,它可以帮助你轻松解决这类bug。

    【讨论】:

    • 如何判断String是否同时包含数字和字母?
    【解决方案4】:

    我不知道,因为它没有指定,如果您需要它只是为了锻炼,或者您需要在现实世界的应用程序中实现。

    在第二种情况下,我建议你使用现有的库来检查密码是否足够强。

    勾选zxcvbn Java version on github,这是Dropbox提供的库的移植。

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2010-11-12
      • 2020-11-03
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      相关资源
      最近更新 更多