问题一:将用户口令加密后再存储。
这是一个系统需要的最基本的安全措施之一。一般都是加密后再以二进制存入数据库。我图个简单,直接存的是加密后的字符串。反正结果是一团乱码,又不可逆。不过有一个问题。由于我采用的是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;