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

时间:2018-05-27 00:48:48

标签: java spring security spring-boot

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

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

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

1 个答案:

答案 0 :(得分:2)

这不是可以在Java中解决的问题。

  

令牌和秘密可用于访问帐户的交易,这意味着应安全地存储令牌秘密对(并防止恶意访问或篡改)。

根本问题在于你要反对这一点:

  • 如果您试图通过管理平台的人来保护它,那么它几乎无法解决 1

  • 如果你想要保护它免受普通" (即非特权)用户,那么你可以依靠普通的文件系统安全性(加上标准服务"强化"),或者你可以使用像Spring Vault或{{3}这样的东西如果本地文件系统安全性不足 2

  • 如果您正在尝试抵御可能能够获得完全管理员权限的黑客,那么这也许是无法解决的。 (虽然黑客可能需要复杂......)

请注意,您可以执行将密钥保存在Java密钥库中的操作,但为了实现这一点,JVM需要密钥库的密钥才能获取密钥。你在哪里存储那个秘密?

旁白:

  

...其中许多是特定于Android并使用Android安全技术(因此不适用于我的应用程序)。

这些技术通常假设平台本身是安全的,并且/或者它没有根植于"由用户。

1 - 所以,如果你的目标是在你给客户使用的应用程序中嵌入一些秘密......放弃。如果这个问题是可以解决的,那么软件,音乐,视频等的简洁性就会有一个简单可靠的技术解决方案。显然......它没有。

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