防御流氓的方法(移动客户端)

信息安全 tls 移动的
2021-08-15 07:57:31

我目前正在构建一个 MVP(金融移动应用程序)并试图了解防止流氓客户端与服务器交互的最佳方法。

在查看大多数移动应用程序的安全性时,我可以看到对这些应用程序进行 MITM 攻击以拦截通过 SSL 的通信是相当容易的。

一些应用程序似乎通过证书固定来阻止这些,但这在越狱手机上也很容易克服。

(我在这个线程中看到客户端证书是否提供针对 MITM的保护?服务器可以验证客户端 - 但在实践中似乎几乎没有人这样做? - 不知道为什么,是否因为可能存在一些不灵活在服务器上固定客户端证书?)

我可以看到我看过的几个最安全的应用程序,在客户端上实现证书固定,然后服务器发送一个额外的公共(?)密钥(我可以在 charles 代理中看到)所以很可能是第二个私人 -公钥交换,但之后我无法再跟踪通信。(最初这个应用程序像许多其他金融应用程序一样似乎通过短信进行带外安全)。

简而言之:1) 有哪些额外的安全选项可用于保护我的应用程序,这些选项超出了客户端上的证书固定(并防止流氓客户端访问服务器?)(不包括越狱预防)。

2) 带外类型的安全性如何工作,这如何提供额外的保护?

谢谢

1个回答

TLS 相互身份验证是我们可以确保与服务器对话的客户端是合法的唯一方法。

您可以执行以下操作:

创建具有证书签名功能的自签名证书(CA=true)

对于每个想要连接到您的用户,当它第一次注册您的服务时,它需要创建一个证书签名请求 (CSR) 并将其提供给您。

您需要使用您的自签名证书签署 CSR 并返回已签名的证书。请注意,即使中间人在中间监听,他手头也只有 CSR 和签名证书。要真正模拟客户端,MITM 还需要访问在创建 CSR 时生成的私钥。此私钥永远不会发送给您(因此 MITM 永远不会嗅探)。

现在,每当客户想与您交谈时,它都会向客户发送问候并询问您的证书。你会提供的。现在,您将要求提供客户的证书(相互身份验证)。客户将向您发送其证书。现在,您将检查提供的证书是否由您的自签名证书签名。如果是这样,请通过使用客户端证书中提到的公钥对其进行加密来发送随机数。

加密的 nonce 将由客户端使用与其公钥关联的私钥解密。然后它将使用从您那里收到的证书中提到的公钥加密回复(在 TLS 的 serverHello/serverCertificate 握手期间)。并将向您发送加密回复。

您将使用与您的公钥关联的私钥解密回复。如果这是您期望的回复,则表示它是合法客户。如果不是,那它是另一端的 MITM。

请注意,为了成功破解连接并解密内容,MITM 需要合法客户端和您(服务器)的私钥。这是不可能的,因为私钥永远不会相互发送,因此 MITM 永远无法嗅探它。

因此建立了与合法客户端的安全通信。

希望这可以澄清。