spring - 如何在 Web 应用程序运行时保留用于解密的 key

标签 spring architecture encryption cryptography

如何在 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/

相关文章:

mysql - 如何在 mysql 数据库中加密电子邮件但仍然能够查询它们?

spring - 使用 spring 自定义 ehcache 逐出策略

java - EasyMock Controller 映射和状态代码测试

java - 我如何更新到 org.springframework spring-web.jar 的最新版本

spring - 访问受 Spring Security 保护的 REST API

algorithm - 如何在树中查找循环引用

algorithm - 如何设计一个系统,我们可以在其中查询最近 n 小时内的热门结果

java - 前端架构

java - 从java中的图像中读取加密字节

android - 在 android 和 iphone 上使用 salt 进行哈希处理