【发布时间】:2019-03-30 07:35:29
【问题描述】:
我想与我的软件一起发送一个文件,该文件的内容需要对我的软件用户隐藏(在线身份验证是不可能的,因为该软件需要离线执行)。我这样做的方法是使用 AES-256 加密文件,然后将加密密钥存储在源文件中。但事实证明,从已编译的可执行文件中恢复此密钥非常容易,因为整个字符串只是位于一个连续的块中。下面的 Python 代码找到了关键:
with open("/path/to/executable", 'rb') as readfile:
content = readfile.read()
to_find = 'C0SH3VKNTKR4CRGH0R8WXD9WR5I1GS' # example key
for i in range(len(content) - len(to_find)):
substr = content[i:i + len(to_find)]
if substr == to_find:
print "Found at index %d" % i
当然,作为攻击者,我不知道我在寻找什么。但是通过查看可执行文件所依赖的共享库(这些库是开源的,解密文件的格式也是一种广泛使用的标准),可以很容易地推断出解密文件的所需格式。所以基本上,只需在构成可执行文件的二进制内容上滑动一个 30 个字符长的窗口,使用每个字符串解密文件,然后检查它是否可以正确解析。
我知道如果密钥以某种格式存在于源代码中,则不可能完全保护密钥,但是在这种情况下,有哪些典型的技术可以用来让攻击者的生活更加困难?
想到的明显解决方案是将密钥拆分为多个子字符串并将它们分散在整个代码中,或者在字符串中间插入虚拟字符,但我对软件安全性的了解为零,所以它会很好听取其他建议。
【问题讨论】:
标签: security encryption obfuscation