gpt4 book ai didi

java - 将敏感信息加载到 Protocol Buffer 的最安全方法

转载 作者:行者123 更新时间:2023-12-01 21:24:50 26 4
gpt4 key购买 nike

我的应用程序使用 Google Protocol Buffer 在客户端和服务器实例之间发送敏感数据。网络链接使用 SSL 加密,因此我不担心网络上的窃听者。由于内存问题解释,我担心敏感数据实际加载到 protobuf 中 in this SO question .

例如:

Login login = Login.newBuilder().setPassword(password)// problem
.build();

由于 Protocol Buffer 是不可变的,是否没有办法安全地执行此操作?

最佳答案

Protobuf 不提供任何使用 char[] 代替 String 的选项。相反,Protobuf 消息被有意设计为完全不可变,这提供了一种不同的安全性:您可以在程序的多个沙箱组件之间共享单个消息实例,而不必担心一个组件可能会修改数据以干扰另一个组件.

在我个人看来,作为一名安全工程师(尽管其他人可能会不同意),您链接到的 SO 问题中描述的“安全”是安全剧场,实际上并不值得追求,原因有很多:

  1. 如果攻击者可以读取您进程的内存,那么您就已经失败了。即使您在丢弃 secret 之前覆盖了它的内存,如果攻击者在正确的时间读取您的内存,他们也会找到密码。但是,更糟糕的是,如果攻击者能够读取您进程的内存,他们可能会做比提取临时密码更糟糕的事情:他们可能会提取长期存在的 secret (例如您服务器的 TLS 私钥) 、覆盖部分内存以更改应用程序的行为、访问应用程序有权访问的任何和所有资源等。这根本不是一个可以通过在使用后将某些字段归零来有效解决的问题。

    <
  2. 实际上,您的 secret 可能被复制的方式有太多,而您无法控制这些方式,从而使整个练习毫无意义:

    • 即使您很小心,垃圾收集器也可能在移动内存时复制 secret ,从而达不到目的。为了避免这种情况,您可能需要使用由非托管内存支持的 ByteBuffer
    • 将数据读入进程时,几乎肯定会通过不会以这种方式覆盖其数据的库代码。例如,InputStream 可能会进行内部缓冲,并且之后可能不会将其缓冲区清零。
    • 操作系统可能随时将您的数据分页到磁盘上的交换空间,并且之后没有义务将该数据清零。因此,即使您将内存清零,它也可能会保留在交换区中。 (加密交换可确保这些 secret 在系统关闭时有效消失,但不一定能防止本地计算机上存在能够从内核中提取交换加密 key 的攻击者。)
    • 等等

因此,在我看来,专门在 Java 中使用可变对象来以这种方式覆盖 secret 并不是一个有用的策略。这些威胁需要在其他地方解决。

关于java - 将敏感信息加载到 Protocol Buffer 的最安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38317319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com