go - 如何隐藏已编译二进制文件中的值
问题描述
我想隐藏代码中存在的字符串常量。例如,在以下代码中 - 变量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 就会变得可见。
解决方案
正如评论所指出的,您无法真正将其完全隐藏。为了至少将其隐藏strings
(如果这就是您想要的),您可以做的是将其另存为 a []byte
,而不是 a string
,如下所示:
package main
import "fmt"
func main() {
a := []byte("someStringXYZ")
fmt.Println(string(a))
}
现在,当我编译并运行strings
它时,它不再找到“someStringXYZ”。如果您尝试过,您显然仍然可以轻松提取它,并且它显然会在运行时出现在内存中,但这可能不是您最关心的问题(我不确定您的应用程序是什么)。
请注意,这仅在文字仅出现在演员表中而不是其他任何地方时才有效。
无论哪种方式 - 如果您有一个硬编码的令牌,并且您需要隐藏它,那么您可能在设计阶段做错了什么。你应该重新考虑那个设计。
编辑:解释为什么这种方法有效;我不确定,但我认为这是因为 []byte 没有与终止的空字节或类似的东西一起存储。strings
只能找到长度为 4 或更长且以某些不可打印字符结尾的可打印字符 - 所以说真的,我们可能只是走运了。正如我之前所说,但换一种说法;混淆不是安全。如果 someStringXYZ 很重要,这是不安全的。
推荐阅读
- html - 当有容器集时,如何使图像宽度为 100%?
- excel - 如何在 Countifs 中排除空字符串
- javascript - 如何制作幻灯片以通过拖动鼠标更改其图片?
- encryption - 解密 ZigBee 包
- android - recyclerView.addOnScrollListener - “使用 MVVM 改造分页”正在加载相同的响应/列表
- flutter - Flutter:Image over Image,部分显示上部图像作为提供的值(例如1到10)
- c - 分段违规接线
- reactjs - 无法将输入数据从 react-autosuggest 传递到父文件
- windows - 使用绝对路径执行 sshd 时卡住
- python - 在 python 中使用 selenium 来捕获网络中的链接