我有一个用 C++ 编写的 Qt 应用程序,它使用 SSL 连接 (QSslSocket) 和另一个应用程序来提高安全性。但是,该应用程序中嵌入了一个私钥。
使用像 Process Explorer 这样的应用程序,很容易找出私钥。(文件的属性 -> 字符串)
安全性对我的应用程序来说不是很重要,但是从我的应用程序中获取私钥变得更加困难会很好。有什么办法吗?
我有一个用 C++ 编写的 Qt 应用程序,它使用 SSL 连接 (QSslSocket) 和另一个应用程序来提高安全性。但是,该应用程序中嵌入了一个私钥。
使用像 Process Explorer 这样的应用程序,很容易找出私钥。(文件的属性 -> 字符串)
安全性对我的应用程序来说不是很重要,但是从我的应用程序中获取私钥变得更加困难会很好。有什么办法吗?
"strings" 只查找实际 Ascii/UTF8/Unicode 字符串的块。如果您将密钥作为二进制缓冲区保存,则没有什么可以将其与字符串通常忽略的随机二进制数据区分开来。
除此之外,还有更聪明的程序,例如 IDA 和 OllyDebug,它们使用户能够完全反汇编甚至反编译您的程序,并且无论您尝试什么都可以掌握密钥。
用一些简单的对称算法加密它。例如定义数组cryptedData
,cryptedDataKey
这样n
你的私钥的第 -th 字节就可以通过cryptedData[cryptedDataKey[n]]
. 它将使您免于使用文本编辑器查看二进制可执行文件但对或多或少有经验的人无济于事的人。
此外,如果您与QSslSocket
运行时有持久连接,则私钥很可能按原样存储在内存中。所以只有修改 QT 库是一种破坏内存中关键表示的方法。
您可能需要从不同的角度来解决您的问题。
我同意 Shoosh 的回答,因为无论您做什么,拥有正确工具和知识的人都能够破解您的代码并找出您的私钥。
您需要做的是将数据外部化或在找到您的私钥时降低风险。
将任何私人数据外部化的最佳方法是使用用户提供的密码对其进行加密,该密码必须由用户输入才能使用。不幸的是,这对于大多数应用程序来说并不合理。
为了降低风险,我通常会尝试确保如果安全性被破坏,只有一个“安装”会受到影响。
例如,在安装时随机生成私钥数据。
对于客户端/服务器应用程序,您可以遵循 https 模型并使用公钥/私钥通信来交换随机生成的加密密钥。
如果每个客户端安装都有自己的公钥/私钥集,那么服务器可以告诉客户端正在连接什么,如果有问题,他们可以取缔客户端。
希望有帮助。
另一种常见的技术是将秘密数据放入二进制资源中,例如图标图像。