代码之家  ›  专栏  ›  技术社区  ›  Justin Albano

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

  •  0
  • Justin Albano  · 技术社区  · 6 年前

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

    在静态存储这些凭证,但向外部服务API提供原始纯文本凭证的安全技术是什么?

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Stephen C    6 年前

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

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

    最根本的问题是你要保护谁:

    • 如果您试图保护它不受平台管理者的攻击,那么它几乎是无法解决的。 .

    • 如果您试图保护它不受“普通”(即非特权)用户的攻击,那么您可以依赖普通的文件系统安全性(加上标准服务“强化”),也可以使用类似 Spring Vault 或A Hardware Security Module 如果本地文件系统安全性不足 .

    • 如果你想防范一个黑客 可以 能够获得完全管理员的特权,这可能也是无法解决的。(尽管黑客可能需要老练……)

    请注意,您可以在Java密钥存储库中进行诸如保存秘密的事情,但是为了做到这一点,JVM需要密钥库来获取密钥。你在哪里商店 那个 秘密?


    旁白:

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

    这些技术通常假定平台本身是安全的,并且/或者它没有被用户“扎根”。


    1-所以,如果你的目标是在你给客户使用的应用程序中嵌入一些秘密…放弃。如果这个问题是可以解决的,那么软件、音乐、视频等的优先级将有一个简单可靠的技术解决方案。很明显…没有。

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