如何在JSP中以编程方式加密/解密纯文本凭据?

时间:2008-11-21 12:27:06

标签: java authentication jsp encryption

作为日常工作的一部分,我不幸地管理了一个古老的,曾经“内部”的JSP Web应用程序,该应用程序依赖于以下身份验证模式:

...

// Validate the user name and password.
if ((user != null) && (password != null) && (
    (user.equals("brianmay") && password.equals("queen")) ||
    (user.equals("rogertaylor") && password.equals("queen")) ||
    (user.equals("freddiemercury") && password.equals("queen")) ||
    (user.equals("johndeacon") && password.equals("queen"))
   )) {
// Store the user name as a session variable.
    session.putValue("user", user);

...

尽管我想,女王成员从未成为该系统的使用者,但无论如何它确实是一个很好的例子,不是吗?

尽管通过策略,此客户端通过域身份验证强制执行安全性,因此这个问题不被视为安全风险,但我的想法是至少使用简单的MD5或SHA1来混淆纯文本凭据方法,因此肉眼看不到这些敏感数据。

对于JSP来说,我是一个全新的人,所以我非常感谢您愿意与我分享的任何建议。

提前多多谢谢!

2 个答案:

答案 0 :(得分:4)

很难理解您正在考虑的确切方案,但我假设密码来自请求,并且您希望计算发送请求的JSP中的MD5哈希值。之后,您可以将其与预先计算的MD5版本进行比较。如果没有使用https,并且在提交密码之前使用javascript MD5 library哈希密码,您甚至可以更安全。

你可以在java中MD5一个字符串,如下所示:

try
{
  String digestInput = "queen";

  MessageDigest messageDigest = MessageDigest.getInstance("MD5");
  messageDigest.update(digestInput.getBytes());

  BASE64Encoder base64Encoder = new BASE64Encoder();
  String digestString = base64Encoder.encode(messageDigest.digest());

  // digestString now contains the md5 hashed password
}
catch (Exception e)
{
  // do some type of logging here
}

答案 1 :(得分:2)

首先,您应该将该逻辑从jsp移动到单独的类中。

其次,您不应该在代码中的任何位置保留纯文本密码。使用某种单向散列函数(md5,sha1,...)并仅保留密码哈希值。

检查用户密码时,首先对其进行哈希处理,然后比较哈希值。