首页 > 解决方案 > 如何隐藏已编译二进制文件中的值

问题描述

我想隐藏代码中存在的字符串常量。例如,在以下代码中 - 变量a的值可以是秘密:

package main

import "fmt"

func main() {
  a := "someStringXYZ"
  fmt.Println(a)
}

这就是编译这个 go 文件的方式:

$ go build -ldflags='-extldflags=-static' abc.go

也可以正常工作:

$ ./abc 
someStringXYZ

如果我strings在这个二进制文件上使用命令,那么我可以获得变量的值a

$ strings abc | grep XYZ
eq=runtime: val=someStringXYZsrmount errortimer expiredtraceStackTabtriggerRatio=value method xadd64 failedxchg64 failed}

有没有办法可以隐藏这个值?

我不是在寻找应用程序将使用 AppTokens 从秘密存储中获取值的解决方案,因为这样 AppTokens 就会变得可见。

标签: go

解决方案


正如评论所指出的,您无法真正将其完全隐藏。为了至少将其隐藏strings(如果这就是您想要的),您可以做的是将其另存为 a []byte,而不是 a string,如下所示:

package main

import "fmt"

func main() {
    a := []byte("someStringXYZ")
    fmt.Println(string(a))
}

现在,当我编译并运行strings它时,它不再找到“someStringXYZ”。如果您尝试过,您显然仍然可以轻松提取它,并且它显然会在运行时出现在内存中,但这可能不是您最关心的问题(我不确定您的应用程序是什么)。

请注意,这仅在文字仅出现在演员表中而不是其他任何地方时才有效。

无论哪种方式 - 如果您有一个硬编码的令牌,并且您需要隐藏它,那么您可能在设计阶段做错了什么。你应该重新考虑那个设计。

编辑:解释为什么这种方法有效;我不确定,但我认为这是因为 []byte 没有与终止的空字节或类似的东西一起存储。strings只能找到长度为 4 或更长且以某些不可打印字符结尾的可打印字符 - 所以说真的,我们可能只是走运了。正如我之前所说,但换一种说法;混淆不是安全。如果 someStringXYZ 很重要,这是不安全的。


推荐阅读