C++ C签名令牌的动态链接和安全性

C++ C签名令牌的动态链接和安全性,c++,c,security,linker,token,C++,C,Security,Linker,Token,当涉及到动态链接时,我有一个关于我的应用程序的安全性和完整性的问题。我想将一个应用程序与libcrypto一起发送到我的客户机,以便对一些JWT令牌进行签名验证。现在,理想情况下,我希望我的客户不要“黑客”我的安全(我不想让他提供自己的代币) 假设我的动态库有这样一个方法: 迈里布·索 void verifyToken(std::string token){ if(外部IBVerifyToken(token)){ //证实 }否则{ //未验证 } } 外部库(例如libcrypto.so):

当涉及到动态链接时,我有一个关于我的应用程序的安全性和完整性的问题。我想将一个应用程序与libcrypto一起发送到我的客户机,以便对一些JWT令牌进行签名验证。现在,理想情况下,我希望我的客户不要“黑客”我的安全(我不想让他提供自己的代币)

假设我的动态库有这样一个方法:

迈里布·索

void verifyToken(std::string token){
if(外部IBVerifyToken(token)){
//证实
}否则{
//未验证
}
}
外部库(例如libcrypto.so):

bool externalLibVerifyToken(std::string token){/*验证它并返回*/}
现在,我的应用程序附带了myLib.so和libcrypto.so,并使用动态C链接(std::string仅用于示例目的)

如果有人,例如目标受众,用另一个libcrypto.so替换libcrypto.so,公开相同的符号,但绕过所有类型的验证,会发生什么?他们可能会从技术上破坏我的核查策略,对吗

第二个问题:我能减轻这种压力吗?
当然,我可以使用libcrypto.a并将其嵌入mylib.so,但也许有更好的策略?

作为一名软件开发人员,您依赖于运行软件的计算机和操作系统的安全性

如果拥有管理员权限的用户想要入侵你的软件,你几乎无能为力。想想看,这不仅仅是更换动态库,他(用户)甚至可以修改软件并完全删除
if
语句


如果用户是您的敌人,只需在您的安全和控制下的服务器上运行该软件。

根据破解程序的确定,您无法真正防止这种情况发生,只要客户端拥有其系统上的所有信息。您可以让它变得更难,但并非不可能。
std::string
看起来不像C。当您在不受信任的系统(如客户端计算机)中运行代码时,您必须假设攻击者完全可以访问您的代码。将验证代码从外部库移动到静态库只会增加发现漏洞并将其武器化所需的时间。一位经验丰富的逆向工程师将在不到一小时内找到验证代码并修补您的可执行文件。为此,我们必须检查机器代码并在那里进行修改。这比将一个动态库切换到另一个库要费劲得多。。。不在服务器上运行是不可能的。它适用于需要在手机上运行(即离线)的Android应用程序。用等效程序库替换程序库并不容易。显然,这不是你做我的错,它需要一个明确的意图,知识和时间。您可以使用许可证保护自己,但如果您管理的是安全关键内容(健康隐私、意识形态隐私、金钱/商品),那么这(法律保护)是不够的。如果您需要的只是使黑客更难进行,那么有一些代码混淆机制使黑客更难进行(但不完全可靠)。正如你所说的加密安全,我认为这是不够的。但没有访问代码的权限。。。只有机器代码(或者我遗漏了什么?)。这肯定很难理解,我认为没有人会费心去做(不值得),所以我不需要进一步混淆它。但是用一个空的shell替换libcrypto听起来非常简单(尽管从未尝试过)。头文件都是公共的。在清空所有函数的实质内容后,从源代码重新编译就足够了。修改二进制代码并不难:任何像样的IDE都能够将二进制代码回滚到汇编程序,汇编程序很容易发现调用并删除跳转指令(想想那些许可证检查被黑客攻击并在线发布的软件)。