我有一个用户名&密码组合,我将用于通过java代码访问安全服务器。
我的想法是:
这是执行此类任务的推荐方法吗?
我读过凭证应该存储在外部,应该如何存储?
答案 0 :(得分:1)
我认为有一些事情会出现这种描述:
您暗示用户提供的凭据是数据库的凭据。数据库通常存储的信息量明显大于任何单个用户应该访问的信息量。此外,即使您确保在确保数据库的各个表/行具有正确的访问级别方面做到了这一点,使最终用户凭证与数据库凭据同义将极大地妨碍任何需要的自动服务器端处理。运行用户数据(例如,聚合统计数据,构建模型,甚至代表用户代表最终用户不在屏幕上的用户)。因此,由于数据库强制执行的访问粒度与服务器环境中运行的程序的访问相对应,而这些程序检查最终用户凭据,因此更为常见(并且出于所述原因,更可取)。
您暗示服务器将存储用户的密码。这通常是一种反模式,因为存储密码本身会在发生泄密时向用户开放更大的风险(特别是如果该密码已在其他服务上重复使用)。通常,系统应该只存储密码(和盐)的哈希 - 通常使用bcrypt - 用于在用户输入密码时确定匹配,而不存储实际密码。
在降低风险方面,需要考虑几个关键事项:
分段数据并尽可能提供间接层。也就是说,数据库应该与与之通信的应用程序隔离(认为不同的虚拟机,不同的OS用户)。身份验证凭据应该由完全独立的数据库和服务器应用程序管理,而不是其他数据。需要验证用户凭据的程序应该永远不会实际看到用户凭据或散列密码;它们应该被给予由进行身份验证的子系统分发的短期访问令牌。等
渗透测试,渗透测试,渗透测试。你第一次会弄错。甚至可能是第二次。确保在坏人检测并利用这些问题之前检测(并修复)这些问题,定期让独立的局外人进行测试。
自动化您的测试和质量检查流程。经过测试的代码比未经测试的代码更安全;如果您有以自动方式运行的单元测试,那么您更有可能捕获安全性失误,并且还将保护您免受代码中安全敏感部分的回归。