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