用户使用注册时提供的用户名和密码登录我的黑莓应用程序。我的应用程序连接到执行所有逻辑的 Java Web 服务。
如何在我的服务器上以安全的方式存储密码和用户名?每个人都说加盐和散列,但我不知道该怎么做,因为我从未使用过它。我如何在 Java 中执行此操作?
如何管理将密码安全地从应用程序发送到服务器?
最佳答案
要存储凭据,一种可能是使用 PBKDF2。 Java 实现(我没有使用过)is available here .通过它运行带有盐值的密码并存储生成的哈希数据。盐值通常是新生成的随机值(每个密码一个)。这有助于防止通过彩虹表(预先计算的散列密码表)进行字典攻击。使用java.security.SecureRandom有可能产生这些。
客户端应用程序可能应该使用 SSL/TLS 连接到服务器。这将提供加密以在从客户端传递到您的服务器应用程序时保护凭据。
编辑 根据我们在评论中的对话,听起来目标似乎不是使用 SSL。假设这是真的,并且没有计划其他端到端通信加密,那么这似乎意味着通信的安全性不是高优先级。如果那是真的,那么所描述的身份验证方案可能足以满足应用程序的需求。尽管如此,似乎值得指出潜在的问题,以便您考虑它们。
- 建议的方案(我认为)是从客户端向服务器发送这个值:
Hash(Hash(password,origsalt),randomsalt)
。这真正意味着密码实际上是Hash(password,origsalt)
。如果攻击者可以获得该信息,那么他们就可以作为该用户登录,因为他们获取该值并将其与新的 salt 值进行散列以进行身份验证。换句话说,如果散列密码数据库遭到破坏,则攻击者可以轻松获得访问权限。这在某种程度上违背了首先对密码进行加盐和散列处理的目的。 - 如果没有 SSL(或其他一些端到端加密),就有可能遭到中间人攻击。他们可以偷听甚至冒充谈话的一端。
关于java - 黑莓应用安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970681/