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