用MessageDigest加密用户口令

时间:2022-09-19 16:49:54
 实验室的网站终于告一段落了。其间碰到了不少问题,也是很常见的。下面将这些问题及解决办法一一列出,以供将来参考。
   问题一:将用户口令加密后再存储。
   这是一个系统需要的最基本的安全措施之一。一般都是加密后再以二进制存入数据库。我图个简单,直接存的是加密后的字符串。反正结果是一团乱码,又不可逆。不过有一个问题。由于我采用的是MySQL数据库,用的是varchar字段来存的,varchar字段最长是255,我用的MD5加密的。如果密码长度大于8位就有问题了。表面上已经把密码密文存入数据库了,但事实上并没有存完。有可能是加密后的字符串的长度超过了varchar的长度,在存入数据库时,自动截掉多的部分了。有时间再改存为二进制吧。

   我用的是java.security.MessageDigest这个类。使用起来很方便。这是我的加密函数:
      public static String getEncryptPwd(String pwd)
      {
            try {
                  // 参数为算法的名字,还可以是SHA等。
                  MessageDigest alg = MessageDigest.getInstance("MD5");
                  alg.update(pwd.getBytes());
                  // 生成一个byte数组
                  byte[] userPwd = alg.digest();
                  // 将byte数组转化为String,这就是存在数据库中的密文
                  return new String(userPwd);
            } catch (Exception e) {
                  e.printStackTrace();
                  return null;
            }
      }
    当用户登录时,比较密码。首先需要将用户输入的密码加密,然后再调用MessageDigest.isEqual()方法来进行比较。直接比较是不行。下面是代码。
        // 数据库中存储的密码密文
        String pwdInDb = //get it from database;      
        // 调用加密函数将用户输入的密码加密
        String userPwd = //用户输入的密码;
        userPwd = getEncryptPwd(userPwd);
        // 像这样比较      
        if (MessageDigest.isEqual(userPwd.getBytes(), pwdInDb.getBytes()))
               return true;