String 如何处理Go中的敏感数据?
对不起,如果以前有人问过这个问题 背景: 我目前正在Go中开发一个API,该API生成访问令牌,用于公开我们公司目前在内部使用的一些API。考虑一下您用于Stripe或Github的令牌。我正在做这样的东西:)。我生成一个令牌,将其散列,然后将其持久化 问题: 据我所知,Go中的字符串是不可变的。我曾经是一名Java工程师。Java中的字符串也是不可变的,并且存在于称为字符串常量池的东西中。无论如何,在Java中,在垃圾收集器运行之前,字符串一直存在于堆中。因此,与其使用字符串,不如使用字符数组作为密码或API令牌 这在Go中是如何工作的?在垃圾回收之前,表示API令牌的字符串在堆上是否有效?有人能劫持我的垃圾堆并抢走代币吗?我应该用别的东西而不是字符串吗?也许要一块符文片?我可以强制垃圾收集我的不可变字符串吗String 如何处理Go中的敏感数据?,string,security,go,garbage-collection,String,Security,Go,Garbage Collection,对不起,如果以前有人问过这个问题 背景: 我目前正在Go中开发一个API,该API生成访问令牌,用于公开我们公司目前在内部使用的一些API。考虑一下您用于Stripe或Github的令牌。我正在做这样的东西:)。我生成一个令牌,将其散列,然后将其持久化 问题: 据我所知,Go中的字符串是不可变的。我曾经是一名Java工程师。Java中的字符串也是不可变的,并且存在于称为字符串常量池的东西中。无论如何,在Java中,在垃圾收集器运行之前,字符串一直存在于堆中。因此,与其使用字符串,不如使用字符数组
谢谢!:-) 根据对我的问题发表的评论,我最终使用了一个
[]字节来处理我的敏感数据。使用完阵列后,我会清除它
我担心的是,当字符串对象仍在堆上时,可能会使用侧通道攻击来访问它们。Go标准库使用[]字节作为键。我可能很幼稚,但是,如何从用go或Java编写的应用程序中劫持堆内存呢?@kingkupps您希望尽可能短地保存敏感数据。查看有关敏感数据的oracle官方文档:任何敏感数据,即使是垃圾收集的,都将保留在内存中,直到被覆盖。有人无法劫持您的堆,但侧通道攻击可能会泄露内存内容,或者页面可能会被调出。如果您担心这些问题,请使用[]字节并在完成后覆盖它。有一个go库可以将页面锁定在内存中,这样它们就不会被调出,您可能还需要搜索这些页面。@kingkupps,不,读取内存不需要破坏主机。你记得吗?RCE是足够的,在虚拟化环境中,您还必须考虑恶意邻居。“我不知道如何利用它,因此我不必担心它”不是一个好的态度。