【问题标题】:How to store username and password in a secure way如何以安全的方式存储用户名和密码
【发布时间】:2015-07-13 08:06:17
【问题描述】:

我正在构建一个 Java Web 应用程序,它必须与 Active Directory (AD) 服务器和另一个 Web 服务 (WS) 服务器通信。 AD 和 WS 都需要使用同一组用户名和密码进行身份验证。我应该如何以安全的方式存储用户名和密码?

我目前正在考虑将加密密码存储在数据库中,而密钥存储在捆绑在 .war 文件中的 Web 应用程序中。应用服务器和数据库服务器在不同的机器上。这是完成这项任务的适当方式吗?请建议是否有更好的方法来做到这一点

【问题讨论】:

  • 是否有机会使用属性或环境变量注入它?
  • 我之前想过将用户名和密码存储在属性文件中。就我而言,使用属性文件需要部署由另一个团队完成的 Web 应用程序,并且需要一系列程序。如果密码被更改,这可能需要一天的时间来更新,这不是首选。

标签: java passwords password-encryption


【解决方案1】:

尝试将集中式用户身份验证作为一项服务,并使用 cookie 来存储用户信息。

【讨论】:

    【解决方案2】:

    您可以对密码和用户名进行编码并将其存储在您想要的位置。并在阅读后对其进行解码。 幸运的是,对于我的应用程序中的这项工作,我创建了一个库包,其中包含用于编码和解码字符串的类。您应该提供您的电子邮件,以便我可以将 jar 文件发送给您。

    要编码,您可以使用与此类似的代码

     String encode(String s){
    char[] ret=new char[s.length];
    for(int i=0;i<s.length();i++)
    {
     ret[i]=(char)((s.charAt(i)+23)*i+12);
     }
    String encoded=new String(ret);
    return encoded;
     }
    

    您可以编写相反的内容来解码编码的字符串。 不要使用自己的算法复制它

    【讨论】:

    • 这非常危险!不要使用它! 如果攻击者获得了对服务器的访问权限,编码绝对没有作用。编码不加密。
    【解决方案3】:

    您可以使用MessageDigest 支持加密功能(例如MD5)的类,并使用它将客户端上的字符串密码转换为字节数组,并将其传输到服务器。您不需要将字符串保存在服务器上,并且只会比较编码的字节数组。 示例:

    String password = null;
    byte[] encoded = null;
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        encoded = md.digest(password.getBytes("UTF-8"));
    } 
    catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 2021-04-25
    • 1970-01-01
    • 2010-12-07
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多