移动应用程序的密钥管理方法

你们中的一些人知道,而有些人却不知道,但是我们所有人都无法构建安全的移动应用程序。

今天我们将讨论密钥管理。 我们一步一步地开始我们的旅程:发现基础结构布局,挖掘威胁,信任和密钥的想法。 讨论密钥管理系统:什么是密钥生成,如何访问和撤销密钥以及许多其他令人兴奋的理论知识! 但是,当然,我们会将这些知识应用于移动应用程序。

看视频

通常,我们在服务器,移动设备,通过公共渠道传输的数据等方面建立信任。 我的意思是真实的东西。 像电缆之类的东西。 是的,我们的基础架构充满了密钥和数据,所有这些都通过电缆实现。 这些电缆很重要-它们不受您的控制,无论您到达办公室外的任何地方-您都依赖这些生物。

为什么我们需要信任?

–为了保护这些电缆中的数据,邪恶的CIA和坏蛋饼干正在那里寻找您的秘密。 通过使用特殊的超级数学技术,我们为与受信任的密钥或机密绑定的受保护数据提供了机密性,真实性和完整性保证。 如果您正确地管理密钥,这是可证明的且不可破解的。

由于“密钥是我们信任的东西”,并且它们控制着系统中的信任,因此管理密钥就是管理信任。 因此,让我们谈谈密钥管理。

按键

–什么是钥匙? –这是一个字节数组。

根据正在进行的过程,我们需要具有不同属性的不同字节数组:

1.我们对对称密码使用秘密密钥。

2.非对称密码的公钥/私钥对

3.密码是您可以记住的字符串。 顺便说一句,这是一个糟糕的钥匙。 我们应该使用KDF代替用户密码本身。

4.一次性PIN很小,并且易于转移具有风险属性的密钥。 这是一个额外的信任令牌,就像您在登录银行系统时通过短信从银行获得的东西。

–我们在闪亮的iOS世界中知道哪些键?

应用令牌,服务器令牌,用户密码,证书,以及类似的东西,不是吗? 它们都是钥匙。

–我们需要它们做什么?

按键保护数据!

它们使您可以访问数据,验证数据的真实性和完整性。 当然,大多数情况下,我们会处理用户将其放入应用程序中的用户生成的数据。 但是,我们还关心访问外部资源(例如第三方服务或Web服务器)以及我们应用中其他用户的可识别数据(例如,来自喜欢您的推文的用户的信息,如果有的话)。

–我们如何保护数据?

哦,您知道,我们能够也无法应对所有这些威胁。 就像数据篡改和泄漏一样,中间人,主动和被动,当然还有橡胶软管密码分析之类的常见问题。

密钥是存储在某处的字节数组,它们解锁受保护的数据并促进信任。 当然,攻击者想要它们。 基本上,密钥是一小部分数据,它们也容易受到威胁。

密钥是一小部分数据,也应该受到保护!

按键会发生什么?

1.攻击者可以窃取密钥,这很糟糕(原因显而易见,不是吗?)。

2.更糟糕的是,被盗的密钥可以重播 -可以用来访问受保护的内容。

3.而且,如果攻击者足够幸运,而您却不是,那么甚至可以替换密钥:攻击者可以抛出自己的邪恶密钥来访问资源。

因此,我们需要构建一个保护和管理密钥的系统。

关键管理系统:目标和行动

在密钥管理中,有一个实际目标:保留信任和安全性,但系统仍然可用。 如果不这样做,您将得到另一个没人愿意使用的超安全超偏执端到端系统system

任何密钥管理系统都包含多个过程,这些过程按顺序链接:从生成到交换,从交换到存储和访问,通过吊销来控制受害和过时的密钥,以及旋转以确保密钥的寿命。 有时,该系统也应包含服务流程:例如备份和对加密数据的管理员访问。

产生与交流

密钥生成的目标是创建数学上强大的信任令牌:抵御暴力破解和智能枚举的令牌。 我们需要使用良好的随机数生成器和一种算法,并结合一个秘密来生成密钥。 为了确保它不会泄漏,我们需要在用户输入机密信息或安全存储密钥的地方生成它。

基本上,使其尽可能靠近使用和存储位置。

密码呢? 密码不是一个很好的密钥:暴力破解很容易,通常用户会输入较差的密码。 密钥派生功能(KDF)有助于将密码转换为具有加密强度的密钥,从而使攻击者感到难过。

生成密钥后,下一步是在受信任方之间交换密钥。 密钥交换是建立信任的重要过程:我们需要安全地交换或分发密钥。

储存与存取

密钥存储非常重要:我们需要以最小化风险的方式存储它们。 重要一点:永远不要将密钥与使用这些密钥加密的数据一起存储。

密钥存储后,我们想访问它们以实际使用它们。 实现平衡是很棘手的:密钥应受到保护,但仍易于合法访问。

轮换和撤销

现在我们知道密钥已经生成并存储了……它们会永远存在吗? 当然不!

关键生命周期是一位先生的传记。 关键-从出生到遗忘。

生命周期将指定密钥何时不再用于加密,密钥不再用于解密,密钥不再是密钥。

当然,您不希望使用一个密钥对所有内容进行加密,对吗? 如果泄漏了,就说明您完成了。 您希望拥有多个密钥-每个用户一个,或者每个组一个,或者每个特定数量的记录至少一个。 一切都与控制风险有关。

现在,如果应该更改密钥怎么办?

您需要系统支持使用新密钥进行的重新加密。 如果有人发现您正在使用的算法遭到攻击怎么办? 您需要更改它。 为此,您需要解密数据,生成新的密钥,加密和存储数据,有时消除未使用的记录,有时确保从内存中正确清除未加密的数据。 ee。 密钥轮换要考虑很多事情。

现在,我们基本上已经完成了理论构想,这里有一个实际的考虑。

除用户功能外,系统还具有某些维护程序,这些程序需要对数据进行特殊访问,例如备份,管理员访问,密码重置。 通过附加密钥和单独的保护层,可以更好地实现这些功能。

实践中的密钥管理

在移动设备上建立信任的主要方法有三种。

1. 关于频道交换。 您首先连接到服务器,记录它的证书,然后再次连接时,可以比较证书。 这样,除了信任证书本身之外,您还信任服务器。

2. 调解交流。 您知道对方的标识符,并且可以要求您信任的人提供其公钥。 例如,您可以使用keybase.io以受信任的方式交换公共密钥。

3. 信任的频道交换。 以上两种方法基于许多假设:您必须信任某人。 最简单的方法总是将密钥或秘密交给与您建立信任关系的一方。 例如,要在您的应用程序中建立与Facebook的信任,您需要通过应用程序令牌进行身份验证。 为此,您需要在Facebook开发门户中注册该应用,然后将应用令牌复制到您的代码中。 那就是您可信赖的通道密钥交换!

存放还是不存放?

那么,人们,您将密钥存储在哪里?

〜代码?〜钥匙扣!

钥匙串很棒,但有时您无法使用它,或者您不想使用它(顺便说一句,如果设备越狱,钥匙串会断开)。

避免密钥泄露的最简单方法-根本不存储密钥! 🙂

但是,如果我需要存储..?

通常,我们处理两种键:用户定义键和应用程序定义键。

内置了应用程序定义的密钥。您已经在应用程序中拥有它们,但是应该正确地存储和访问它们。

用户定义的键是用户输入的或基于用户输入的键。 这些密钥应在正确的时间放置在正确的位置。

混淆很有趣,但不要依赖它

混淆密钥的方法有多种:将它们存储为十六进制字符,或替换密钥字符串中的字符。

混淆取决于社会工程,目标是使攻击者感到困惑:例如保存证书,但将其重命名为mp3文件。 或将密钥拆分为不同的片段,然后将其放置在不同的位置。 实验。

但是,训练有素的攻击者将在数分钟内打破这种防御。 最好将时间花在认真的防御上。

存储加密

简单:

1.在开发过程中加密密钥

2.仅存储加密密钥

3.使用前解密

此技术可与应用程序定义的键配合使用。 您可能会问:如何存储用于加密密钥的密钥? 🙂

答案是:并非每个密钥都应存储。 您可以根据已知的知识(例如捆绑包ID或27除以13的结果的后4位数字)生成或计算加密密钥。

毒键和蜜罐

欺骗学派的另一种突出的技术是毒键

使攻击者认为他们拥有正确的密钥,使他们使用这些密钥。 还要警惕:攻击者正在戳您的应用程序,天真地尝试对您使用假密钥。

这项技术与蜜罐配合得很好:将这些毒键存储在明显的地方,然后看日志。

例如,将伪造的密钥存储在plist文件中,或将“ server.cert”放入应用程序捆绑包中。 有时,您可以采取的最佳措施来预防攻击实际上是及时发现它们。 就是这种情况。 顺便说一句,您仍然必须非常好地保护真实密钥。

关键点

对于系统的每个片段,信任的应用方式都不同。 没有宗教选择。 最好的解决方案来自评估您的真实体系结构并为其安装工具。

阅读更多

  • 密码存储备忘单[OWASP]
  • 密钥管理备忘单[OWASP]
  • 管理密钥,证书和密码[Apple]

想查看我的更多安全幻灯片吗?