如何在 Java Web 应用程序的用户 session 期间安全地存储 javax.crypto.SecretKey
类型的加密 key 对象?我必须管理这样的 key ,因为我只能在登录后创建该 key ,但稍后可能需要该 key 来解密敏感用户数据。
secretKey 本身是通过基于密码的派生 key 函数(当前为“PBKDF2WithHmacSHA1”)从用户密码派生的。使用的盐和迭代次数持久存在于数据库中。使用这些参数(密码、盐和迭代),我可以在登录后、密码可用时立即重新创建该密码 key 。在那之后, 我想将生成的 key 保留在内存中,而不是始终保留纯密码。
由于我使用 Spring/Hibernate,将该关键对象放入具有 session 范围的 bean 中是否安全?这样的对象仅存在于内存中并且应该是安全的,不是吗?
一般问题:如果 key 可用的时间与该 key 应使用的时间不同,甚至相差几分钟,是否可以构建安全的环境?
最佳答案
这完全取决于您对此项目的“安全”要求/定义。
从理论上讲,将 key 保存在 session 范围内的内存中是“安全的”,因为理论上它不应该从其他 session 中访问。当然,除非 Spring、Web 容器或您的代码中存在错误或安全漏洞 - 请查看 session hijacking例如,确保您了解潜在风险。
另一方面,一旦 key 以可读形式存在于内存中,就可以通过内存转储或不安全的交换文件来恢复它。如果 session 是分布式的或持久的,那么当 session 数据传输到另一个节点或持久到磁盘或数据库时,它可能会被拦截。当然,这相对更困难,并且需要访问运行您的软件的网络或盒子。关于spring - 如何在 Web 应用程序运行时保留用于解密的 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8533698/