java - 如何使用本身加密的私钥/密码加密数据?
问题描述
我想使用 Java 以以下方式加密一些数据(一些简单的文本):
- 我必须向将运行应用程序的服务器提供一次编码密钥/密码。
- 然后,应用程序可以使用先前存储的密钥自行加密数据。
- 可以访问服务器的攻击者将无法获取存储的密钥。
换句话说,我希望我的应用程序能够自己加密一些数据,而不需要每次都需要密钥,并且我希望这个密钥本身被加密(而不是以纯文本形式存储),这样攻击者就无法获得它。
我可以使用哪些工具/技术来实现这一目标?
解决方案
可以访问服务器的攻击者将无法获取存储的密钥
这通常是一个问题,主要是在您的数据旁边有一个加密密钥时。一旦密钥泄露,没有什么能阻止攻击者解密数据。您的主要任务是防止攻击者首先获得对密钥的访问权(我知道,这很容易说)。
似乎您只想将密钥保留在内存中,这在许多情况下可能是个好主意。解密时,最后密钥无论如何都需要在内存中。
我希望这个密钥本身被加密(不以纯文本形式存储)
然后您需要存储和维护一个加密密钥来加密第一个密钥。你有同样的问题来保护这两个密钥。
建议:
我经常看到使用外部服务来管理密钥或进行加密操作(密钥库、密钥管理服务、HSM、TPM 等)的解决方案。但是 - 如果攻击者获得完全的应用程序级访问权限,他可能会使用相同的服务来解密数据。
但至少如果数据泄露(根据我的经验,备份或旧副本经常泄露),这些服务将有助于使数据无法访问。
推荐阅读
- python - 试图同时求解微分方程
- algorithm - 计算递推方程输入大小的策略?
- angular - Angular Error Value 必须是多选模式下的数组。垫选择多个
- react-native - 如何在 Flutter 应用程序中更新任何包或库时动态更新应用程序而不更新应用程序
- reactjs - 在复选框上调用函数
- c# - 在 C# 中从 MemoryStream 更改为 Stream
- javascript - 使用 SVG 图标路径绘图
- gmail-api - 选项对象 - Gmail API - 它在哪里记录?
- sqlite - 如何使用 Diesel 和 SQLite 获取新创建值的 id?
- reactjs - header.component.tsx(14, 15):未提供“e”的参数