【问题标题】:Obfuscating decryption key stored in source code混淆存储在源代码中的解密密钥
【发布时间】: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


    【解决方案1】:

    有一个完整的研究领域称为白盒密码学。只需谷歌即可。

    其中一个选项是使用白盒加密AES 代码生成器。给定一个密钥,它将为这个特定的密钥生成实现 AES 或 AES 的一部分的源代码。密钥间接嵌入在代码中。它没有显式存储。

    看来Whitebox-crypto-AES就是这样一个代码生成器。我从来没有使用过它。试试看吧……

    【讨论】:

      【解决方案2】:

      如果您使用 DotNet 技术(MS .Net 或 DotNet Core),您可以使用 DPAPI 保护此类密钥。

      基本上,您使用密钥派生方法在首次使用时派生/生成密钥,然后使用 DPAPI 保护注册表或文件中的密钥。

      【讨论】:

        猜你喜欢
        • 2014-03-01
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 2013-04-29
        相关资源
        最近更新 更多