保护移动连接 – 存储秘密和密钥
感谢您花时间阅读本文,我是一个年轻的开发人员,在Web项目和服务器端编码方面有一些专业经验,但我现在正在构build我的第一个移动应用程序,经过深入的研究,我没有能够澄清一些关于保护移动应用程序数据传输的问题。
以下是我认为我正确理解的内容:通过实施SSL证书(以及可选的SSL客户端lockingfunction),可以在很大程度上防止在开放networking上嗅探用户信息,以及模拟其他用户(Man-in-中等等)。 任何进一步的安全层旨在保护服务器,并防止有人获得您的交易结构和细节的见解。 进一步的安全层包括消息authentication(例如HMAC)在处理消息之前对消息进行authentication,以及encryption以“隐藏”消息的内容。
我想实施一个encryption然后HMAC进程来进一步确保交易,这是我的问题,关于这个过程: 你如何存储在客户端上的密钥/秘密? 我意识到这将取决于具体的应用程序,以及它希望达到的安全程度。 由于这个原因,我包括一些细节:没有关于用户存储或转移(SSN,银行等)的高度敏感的信息,但应用程序处理付款,因此如果有人开始搞乱服务器,可能会导致高成本和支付系统。 因此,我希望实现客户端和服务器之间的安全传输,而不是做一些不寻常或不相称的事情。
我已经阅读了很多关于这个主题的内容,并且从我可以收集的内容中了解到,不pipe从哪个方式获得密钥或秘密,在某些时候它将以明文方式呈现给encryption/散列逻辑,因此有人将能够进行debugging应用程序,断点,步骤和妥协的关键/秘密。 你怎么解决这个问题? 什么会被认为是“合适的”(硬编码?来自表结构或其他元素?其他?)。
这个问题真的是高层次和概念性的,所以我不认为这是我讨论的平台,但是无论如何,现在我编写iOS应用程序,而后端是.NET
非常感谢您的时间,任何帮助或见解将不胜感激。 如果我能澄清应用程序的任何方面,我会很乐意这样做。 最好的,米歇尔
你已经做好了确定处理关键事实上是最难的部分。
有一个错误, 有可能有一个系统,从不暴露的钥匙,这是银行业所做的。 这是因为encryption/解密是由硬件在每个阶段完成的。 硬件内部的密钥不能从设备中提取。 一个简单的例子就是手机和欧洲的信用卡/借记卡中的智能卡。 另一个是在通信链中的银行和其他金融实体使用的HSM(硬件安全模块)。 即使ATM上的密码键盘也在键盘本身的硬件中执行encryption。 我提到所有这些,因为你声明申请涉及货币交易。
如果客户端是iOS设备,则可以将密钥存储在密钥keychain
,这是与TPM( 可信平台模块 )等同的硬件的密码安全部分。 它受PIN码保护,请注意PIN码可以设置为默认的四位数以上。 设备上的攻击,即使是在监狱中的手机上,也必须使用钥匙串,并且尝试每次尝试(按devise)具有最短的时间,从而确保基于PIN复杂度的最小平均攻击时间。 closures设备唯一可用的攻击是不可行的蛮力。
弱点是在encryption和解密过程中密钥是清晰的。 如果密钥永远在基础对象(例如:NSString / NSData)中,那么它有可能在使用之后仍然存在,最好使用“c”字符数组并在使用后清除它们。
好的,实际的解决scheme:雇用一个encryption领域的专家,如果你真的想要安全。 我至less雇用一个人来build议和审查devise和实施。 寻找具有CISSPauthentication和encryption领域经验的人。 CISSP要求在实地直接监督下工作至less5年,工作时间为6小时,考试时间一般为160小时,每年继续教育为40小时。