java - 如何安全地存储外部服务的凭据

标签 java spring security spring-boot

我正在开发一个预算应用程序,该应用程序使用一组 token 和 key 来访问外部金融服务,其中 token - key 对映射到单个帐户。在该系统中,用户可以拥有多个帐户,因此可以拥有多组 token - secret 对。 token 和 secret 可用于访问帐户的交易,这意味着 token - secret 对应安全存储(并防止恶意访问或篡改)。尽管这些对应该安全存储,但外部金融服务 API 需要明文形式的 token 和 secret 。

什么是静态存储这些凭据并向外部服务 API 提供原始明文凭据的安全技术?

我的应用程序是一个用 Java 9+ 编写的基于 REST 的 Spring Boot 应用程序。尽管我在这个主题上看到过其他答案,但其中许多都是特定于 Android 的,并使用 Android 安全技术(因此不适用于我的应用程序)。该应用程序还使用 Spring Data MonogDB 来存储其他非敏感信息,但如果需要其他技术来满足上述安全要求,我愿意接受建议。

最佳答案

这不是 Java 内部可以解决的问题。

The token and secret can be used to access the transactions for an account, which means that the token-secret pairs should be securely stored (and be guarded against nefarious access or tampering).

根本问题是你要针对谁来确保这一点:

  • 如果您试图保护平台免受管理平台人员的攻击,那么这几乎是无法解决的1

  • 如果您试图保护它免受“普通”(即非特权)用户的攻击,那么您可以依靠普通文件系统安全性(加上标准服务“强化”),或者您可以使用类似的东西一个Spring VaultHardware Security Module如果本地文件系统安全性不足2

  • 如果您试图防范可能获得完全管理员权限的黑客,这可能也是无法解决的。 (尽管黑客可能需要很老练......)

请注意,您可以执行诸如将 secret 保存在 Java keystore 中之类的操作,但为了执行此操作,JVM 需要 keystore 的 secret key 才能获取 secret 。您将这个 secret 存储在哪里?

<小时/>

旁白:

... many of them are specific to Android and use Android security techniques (as are thus not applicable to my application).

这些技术通常假设平台本身是安全的,和/或它尚未被用户“root”。

<小时/>

1 - 因此,如果您的目标是在提供给客户使用的应用程序中嵌入一些 secret ……放弃。如果这个问题能够解决,那么软件、音乐、视频等的盗版问题就会有一个简单而可靠的技术解决方案。显然……事实并非如此。

2 - 对于很多目的来说,这还不够。但是,决策应基于风险评估,并平衡风险与安全失败后果的成本/严重性。

关于java - 如何安全地存储外部服务的凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50548162/

相关文章:

php - 为 gif/jpg/png/pdf/doc、wmv 文件构建 PHP uploader ,可行,还是我应该购买一些东西?

linux - Docker - 在 ENTRYPOINT 中切换到非 root 用户是否安全?

java - 接收可序列化对象并显示内容

java - 解析InputStream "on the fly"/重用InputStream

java - 隐藏文本字符串?

java - 使用 java 和 tomcat 8 连接到 sql server

java - 如何在某些 Spring 测试中注入(inject)类的特定实例?

java - 使用 Spring 的开源项目 <中型>

Android - 你如何处理 9774d56d682e549c ?安卓ID

java - 有没有好的纯java浏览器模拟器?