应用程序安全性的第一法则:攻击者获得不受限制的物理或电子访问的任何计算机现在都属于您的攻击者,无论它实际在何处或您为之付款。
应用程序安全性的第二条规则:任何离开攻击者无法进入的物理边界的软件现在都属于您的攻击者,无论您花了多少时间对其进行编码。
第三条规则:任何离开攻击者无法穿透的相同物理边界的信息现在都属于您的攻击者,无论它对您有多有价值。
信息技术安全的基础是基于这三个基本原则。唯一真正安全的计算机是锁在法拉第笼,钢笼中的保险箱中的计算机。有些计算机将大部分服务用于这种状态。每年一次(或更短时间),它们会为受信任的根证书颁发机构生成私钥(在许多见证人的面前,摄像机会记录他们所在房间的每一英寸)。
现在,大多数计算机不在这种类型的环境下使用。它们实际上是开放的,通过无线信道连接到Internet。简而言之,他们和软件一样容易受到攻击。因此,它们不被信任。为了使其有用,计算机及其软件在某些方面必须知道或要做某些事情,但必须小心以确保它们永远不会知道或做不成足以造成损坏的事情(至少不是在该单台计算机范围之外的永久损坏) )。
您已经知道所有这些;这就是为什么您要保护应用程序代码的原因。但是,这是第一个问题。混淆工具会使代码变得一团糟,以供人们尝试挖掘,但是程序仍然必须运行;这意味着应用程序及其使用的数据的实际逻辑流不受混淆的影响。有了一点坚韧性,攻击者就可以简单地对代码进行混淆处理,而在某些情况下,即使他所寻找的只是他所寻找的东西,这甚至不是必需的。
相反,您应该尝试确保攻击者无论对代码进行清晰的复制有多么容易,都无法对您的代码执行任何操作。这意味着,没有硬编码的秘密,因为一旦代码离开您开发它的建筑物,这些秘密就不是秘密了。
您已硬编码的这些键值应从应用程序的源代码中完全删除。相反,它们应该位于三个位置之一;设备上的易失性内存,攻击者很难(但仍然不是不可能)获得脱机副本;永久地位于服务器群集上,您可以用铁拳来控制对其的访问;或与设备或服务器无关的第二个数据存储区(例如物理卡)或用户的内存中(这意味着它最终将位于易失性内存中,但时间不必太长)。
考虑以下方案。用户将他们的应用凭据从内存输入到设备中。不幸的是,您必须相信键盘记录器或Trojan尚未损害用户的设备。在这方面,您可以做的最好的事情是通过记住与用户使用的设备(MAC / IP,IMEI等)有关的伪造的识别信息,并通过提供至少一个附加通道来实现多因素安全性。可以验证不熟悉的设备上的登录尝试。
一旦输入了凭据,客户端软件就会对其进行混淆(使用安全哈希),并丢弃纯文本凭据。他们达到了目的。混淆的凭证通过安全通道发送到经过证书验证的服务器,该服务器再次对其进行哈希处理以生成用于验证登录有效性的数据。这样,客户端永远不知道实际与数据库值进行比较,应用服务器永远不知道其收到的用于验证的背后的明文凭证,数据服务器永远都不知道其存储的用于验证的数据是如何产生的,即使安全通道遭到破坏,中间人也只会看到乱码。
验证后,服务器将通过通道发送回令牌。令牌仅在安全会话中有用,由随机噪声或会话标识符的加密(因此可验证)副本组成,并且客户端应用程序必须将此令牌在同一通道上发送给服务器,作为任何请求的一部分做某事。客户端应用程序将执行多次操作,因为它无法执行任何涉及金钱,敏感数据或任何其他可能自身损坏的操作;它必须改为要求服务器执行此任务。客户端应用程序永远不会将任何敏感信息写入设备本身的持久性存储器中,至少不会以纯文本形式写入。客户端可以通过安全通道向服务器请求对称密钥,以加密服务器将记住的任何本地数据;在以后的会话中,客户端可以要求服务器提供相同的密钥以解密数据以用于易失性存储器。这些数据也不是唯一的副本。客户端存储的所有内容也应以某种形式传输到服务器。
显然,这使您的应用程序严重依赖Internet访问。如果没有与服务器的正确连接和认证,客户端设备将无法执行其任何基本功能。真的和Facebook没有什么不同。
现在,攻击者想要的计算机是您的服务器,因为它而不是客户端应用程序/设备是可以使他赚钱或使其他人痛苦的事情。没关系; 与尝试保护所有客户端相比,花费更多的金钱和精力来确保服务器的安全性比您得到的高得多。该服务器可以位于各种防火墙和其他电子安全保护之后,并且还可以在钢,混凝土,钥匙卡/密码访问和24小时视频监控之后进行物理保护。攻击者的确需要非常复杂才能直接获得对服务器的任何访问权,并且(应该)立即知道它。
攻击者所能做的最好的就是窃取用户的电话和凭据,并以客户端的有限权限登录到服务器。如果发生这种情况,就像丢了信用卡一样,应该指示合法用户拨打800号码(最好容易记住,并且不要放在钱包,钱包或公文包中可能携带的信用卡背面)他们可以从任何可访问的电话中将其窃取到移动设备旁边,并将其直接连接到您的客户服务。他们声明手机被盗,提供一些基本的唯一标识符,并且该帐户已被锁定,攻击者可能已经能够处理的所有交易都将被回滚,并且攻击者将回到原来的状态。