感谢您抽出宝贵时间阅读本文,我是一名年轻的开发人员,在网络项目和服务器端编码方面拥有一些专业经验,但我现在正在构建我的第一个移动应用程序并经过深入的在线研究后我无法澄清一些关于保护移动应用程序数据传输的问题。
以下是我认为我理解正确的内容: 通过实施SSL证书(以及可选的SSL客户端固定),您可以在很大程度上防止在开放网络上嗅探用户信息,以及其他用户(中间人等)的模仿。任何进一步的安全层都旨在保护服务器并防止有人获得有关您的事务结构和详细信息的见解。 更进一步的安全层包括消息验证(例如HMAC),用于在处理消息之前对消息进行身份验证,以及加密以“隐藏”消息内容。
我想实施Encrypt-then-HMAC流程以进一步保护交易,这是我对此流程的疑问:如何在客户端存储密钥/密钥? 我意识到这将根据应用程序的具体情况以及它希望实现的安全程度而有所不同。出于这个原因,我提供了一些细节:没有关于存储或转移用户的高度敏感信息(SSN,银行等),但应用程序确实处理付款,因此如果有人开始搞乱服务器,可能会产生高成本和支付系统。因此,我希望在客户端和服务器之间实现安全传输,而不会做出与众不同或不成比例的事情。
我已经阅读了很多关于这个主题的内容,并且从我可以收集到的内容中,无论你从哪个方面获得密钥或秘密,在某些时候它将以明文形式呈现给加密/散列逻辑,因此有人会能够调试应用程序,断点那一步并妥协密钥/秘密。你怎么解决这个问题(也可以)? 什么被认为是“适当的”(硬编码?从表结构或其他元素派生?其他?)。
这个问题实际上是高级和概念性的,所以我认为我讨论的是哪个平台并不重要,但无论如何我目前正在编写iOS应用程序,而后端是.NET
非常感谢你的时间,非常感谢任何帮助或见解。如果我能澄清申请的任何方面,我会很乐意这样做。 最好, 米歇尔
答案 0 :(得分:1)
你已经做好了确定处理密钥实际上是困难的部分。
有一个错误, 可能会让系统永远不会暴露密钥,而这正是银行业所做的。这是因为加密/解密是在每个阶段由硬件完成的。硬件内部具有密钥,使其无法从设备中提取。一个简单的例子是欧洲的手机和信用卡/借记卡中的智能卡。另一个是通信链中的银行和其他金融实体使用的HSM(硬件安全模块)。甚至ATM上的PIN键盘也在键盘本身的硬件中执行加密。我提到这一切是因为你说申请涉及货币交易。
如果客户端是iOS设备,您可以将密钥存储在keychain
中,它是硬件的加密安全部分,与TPM(Trusted Platform Module)等效。它受PIN设备PIN的保护,请注意PIN可以设置为超过默认的四位数。即使在监狱破坏的电话上,设备上的攻击也必须使用钥匙串,并且尝试每次尝试的时间最短(按设计),从而确保基于PIN复杂性的最小平均攻击时间。在设备外,唯一可用的攻击是蛮力,这是不可行的。
缺点是密钥在加密和解密期间将处于清除状态。如果密钥永远存在于Foundation对象中(例如:NSString / NSData),则它有可能在使用后继续存在,最好保留“c”字符数组并在使用后清除它们。
好的,实用的解决方案:如果您真的需要安全性,请聘请加密域专家。我至少雇用一个人来建议和审查设计和实施。寻找在加密领域具有CISSP认证和经验的人。 CISSP要求至少五年在现场直接监督,6小时测试,一般约160小时的测试学习时间和每年40小时的继续教育。