【问题标题】:Struts2: how to store safety username and password from action to actionStruts2:如何存储从动作到动作的安全用户名和密码
【发布时间】:2014-03-07 16:21:50
【问题描述】:

在我的登录页面中,我通过用户名和密码(从 jsp 页面获取)登录,然后检查 LDAP,如果凭据正确,则继续浏览其他页面。

我想将用户名和密码存储在某个地方,因为在接下来的一些页面中,我可能需要它们来制作其他东西。

我想将它们存储在会话中,但我担心这会带来安全问题。我错了吗?也许将它们存储在数据库中并在每次我需要它们时查询数据库并在会话中存储一个指向数据库记录的 ID 会更好吗? (这可能没问题,但可能存在更快更好的方法)

从一个动作到另一个动作存储它们的最佳方式是什么?

【问题讨论】:

    标签: security session struts2 action


    【解决方案1】:

    不同地方的不同密码

    您应该为您的 Web 应用程序和 LDAP 使用不同的密码。就像现在一样,发现 LDAP 密码的攻击者会自动获得对您应用程序的访问权限,反之亦然。

    在您的 web 应用程序中创建新密码时,通过检查其是否相等(针对 LDAP 密码)强制用户(通常希望在所有地方使用相同的密码,因为它很容易记住)选择不同的密码。

    从不保存密码

    您不应将用户密码保存在任何地方,因为任何拥有数据库访问权限的人都可以检索所有密码。

    正确的做法不是加密,而是单向hashing(最好用Salt,防止Rainbow Tables攻击):

    1. 在用户创建密码时对密码进行哈希处理,然后将结果保存到数据库中。
    2. 当用户登录时,对他输入的密码进行哈希处理,然后将生成的哈希值与数据库中的哈希值进行核对。
    3. 如果用户忘记密码,请重置密码并让他选择一个新密码。

    在 Java 中,最好的实现之一是 jBCrypt,基于 BCrypt

    总是更喜欢 char[] 而不是 String 来处理密码

    因为出于不同的原因它更安全 Jon Skeet said it :)

    【讨论】:

    • 你又一次清晰而珍贵。 :) 我不知道我关心这个是否有用,因为密码可能会从我无法控制的其他一些地方被盗...... -.-' 所以也许从安全的角度来看,只是在这种情况下,将密码存储在会话中是相同的。如果有人想偷它,他还有其他选择... :|
    • 如果您不关心这一点,那么就不要输入密码 :) 如果您按照上述方式进行操作,则将 1) 您密码的哈希值和 2) 可检索的 (加密)LDAP 密码,唯一可能被盗的密码将是后者。没有其他(简单的)方法可以窃取您的密码。
    • 已知故事 :) 万一遇到麻烦he will deny it,请务必写一些关于此的内容 ;)
    • 是的,这是个问题,我必须在 stackExchange 的另一部分询问如何对老板说:“你能不能给我发一封电子邮件,说明我们昨天的谈话内容?以防万一。 .." :D 没有最后的部分也不是那么容易... :D
    猜你喜欢
    • 2015-07-13
    • 2010-12-07
    • 2023-04-01
    • 1970-01-01
    • 2010-12-07
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    相关资源
    最近更新 更多