2011-12-16 87 views
1

如何在Java Web应用程序的用户会话期间安全地存储类型javax.crypto.SecretKey的加密密钥对象?我必须管理这样一个密钥,因为我只能在登录后创建该密钥,但稍后可能需要该密钥才能解密敏感用户数据。如何在Web应用程序运行时保留用于解密的密钥

secretKey本身是通过基于密码的衍生密钥函数(当前为“PBKDF2WithHmacSHA1”)从用户密码派生而来的。使用的salt和迭代次数在数据库中是持久的。通过这些参数 - 密码,salt和迭代 - 我可以在登录后立即重新创建密码密钥,当密码可用时。之后, 我想将生成的密钥保存在内存中,而不是始终保持密码。

因为我使用的是Spring/Hibernate,可以安全地将该键对象放入具有会话范围的bean中吗?这样的对象只存在于内存中,应该是安全的,不是吗?

一般问题:如果密钥可用的时间不同于该密钥应该使用的时间,甚至几分钟就可以建立安全环境吗?

回答

3

这一切都取决于你对这个项目的'安全'要求/定义。

在会话范围内保存秘密密钥是安全的,从理论上讲它不应该从其他会话访问。除非Spring,web容器或代码中存在缺陷或安全漏洞,否则请参见session hijacking,确保您了解潜在风险。

另一方面,一旦秘密密钥以可读形式存储在内存中,它可以通过内存转储或通过不安全的交换文件进行恢复。如果会话分布式或持久性,会话数据传输到另一个节点或持久化到磁盘或数据库时,会话可能会被拦截。当然,这相对来说比较困难,并且需要访问运行软件的网络或盒子。

相关问题