我应该如何在 c# 中解决我的方法访问安全性



我正在从事销售点项目,该项目由一家特殊银行提供给我们公司。银行提供了一个DLL,通过USB端口与POS交互。我添加了用.NET C#语言编写的DLL,因此不存在互操作性问题。DLL 中有一个方法称为 DebitAndShareTheAmount 。此方法有两个主要参数P1,P2

P1是明文中的金额,P2是应该从明文中再次从P1中减去的金额。因此,如果我打电话给DebitAndShare(1000,10);//它实际上会在银行贷记我的帐户 1000-10=990 美元和使用我的应用程序的商店 10$。

问题是,任何具有C#编程基本知识并访问该商店计算机的人都可以安装Visual Studio并使用该DLL并调用DebitAndShare方法,其余的您就知道了。实际上,我们的应用程序将充当服务提供商,并在全国各地的特殊商店提供,商店的所有者将通过向客户提供我们应用程序中提供的服务并获得报酬(10 美元)。我将与POS开发人员就我刚才提到的安全问题举行会议。

我已经浏览了MCTS书籍,在本书的安全部分,我发现如果银行DLL在DebitAndShare方法之前使用PublisherIdentityPermission(SecurityAction.InheritanceDemand, CertFile=@"SomeCert.cer")属性并将此方法标记为受保护,那么我们可以有一个安全级别,对吗? 你有什么建议。我还认为,如果银行可以给我们加密算法的方法,那么它也足够了。

您要做的是阻止您的应用程序被破解,这类似于我之前遇到的许可问题,我没有从社区获得任何出色的解决方案,而只是一些好的建议,这里的重点是无论您多么努力,只要您在用户有权访问的计算机上执行代码, 它总是容易受到攻击,更不用说代码混淆了,即使是加密有时也无法保护您的应用程序免受具有足够技能的坚定破解者的侵害,并且从弄乱您的应用程序的盈利能力来看,会有很多确定的(唯一的事情是他们需要知道它可以做到,他们会找到一个有技能的人)。

我在这里可能听起来像一个悲观主义者,但这是残酷的事实。

根据我的说法,最好的方法是将更容易被破解的代码部分移动到中央服务器,并将这些方法公开为Web服务调用。我知道即使这样也不完全安全,还记得最近的苹果应用商店黑客攻击。确保您遵循了所有最佳实践,并希望您会在其他人之前发现系统中的裂缝

正如评论所示,您将在确保这一点时遇到严重问题。但是,我想到了至少会有所帮助的几种方法。

  1. 走在堆栈上。在您的调用站点中,查看当前堆栈,然后返回。如果你看到任何不符合你期望的东西,那就失败。这不是万无一失的,但它会阻止那些不熟练和/或可以看到你的源代码的人。

  2. 使用安全字符串和外部密钥。这要求您有一些从某处获取安全值的方法。一旦有了它,您就可以对数据进行加密/签名,以确保它不会被篡改(通过证书或其他机制)。调试器(类似于WinDBG)仍然能够破坏它,但不太容易。

  3. 在 C++ 中重新生成代码。机器代码更难找到,但这仍然不会阻止了解Windows内部的人。

与其试图通过保护您的应用程序来清空海洋,不如采取多种措施,然后按照银行的做法去做。 寻找没有意义的模式。如果特定 POS 通常生成大约 100 的值,则当您看到大订单或小订单时,请将其标记为审核。交易量突然增加?同样的事情。

除了技术解决方案之外,您最好的选择(恕我直言)是确保商店部分处于欺诈的困境中。金钱在线导致人们更加小心谁可以访问计算机。

埃里克

你可以拥有它,以便函数接受类似于你的pin的东西,以便函数调用银行数据库来检查你的pin是否正确。这样,至少如果有人获得访问权限,他们必须先禁用 pin 参数。

您还可以遵循 Gabe 方法,让系统将帐户映射到设备,并使其只能从注册的设备访问该功能。此外,也许这样做使源代码不是存储在银行计算机上,而是存储在银行保险库/保险箱中的存储设备中。然后这个人实际上必须抢劫银行才能得到它。作为双重措施,加密/设置设备密码,以便只有解密算法(在银行的系统上,劫匪不太可能回去)或已知密码可以提取源代码。

如果这不起作用,我没有更明智的想法(除非将源保存在回收站中或将源锁定在核掩体中算是明智的)。

我们应该使用延迟签名。银行的授权人员在设备中部署正确签名的 dll。 银行用他们的私钥签名。

通过此调用的所有调用都是真实的,所有其他调用都是黑客请求。

最新更新