Google风格的安全性



Google I / O 2019已经死了,该是时候了 在新架构上重写项目 学习新事物。 由于我对移动应用程序的安全性感兴趣,因此我首先提请注意JetPack系列中的新库-security -crypto 。 该库有助于正确地组织数据加密,同时保护开发人员免受此过程带来的所有细微差别。


历史背景


Android中的数据加密一直引起很多讨论。 选择哪种算法? 使用哪种加密模式? 什么是填充? 在哪里存储密钥? 学习所有这些并保持最新知识对于普通开发人员而言可能很困难。 因此,故事通常以以下三种情况之一结束:


  • 使用stackoverflow复制粘贴第一个解决方案
  • 搜索“合适的手册”以及后续的实施和收集耙
  • 激活“等等!”协议

随着android开发人员社区的发展,库开始出现来帮助解决此问题。 这些解决方案的质量差别很大:从所有这些品种中,我只能选择我们在Redmadrobot中使用的java-aes-crypto 。 相当高质量的实现,但是有一些问题。


首先,它只是字符串加密。 这本身还不错,但是这些字符串需要存储在数据库或SharedPreferences中的某个位置。 因此,您需要在数据源上编写包装器,以便对所有内容进行实时加密(我们曾经这样做过)。 但这是需要支持,从一个项目拖到另一个项目或在一个库中执行以便易于使用的代码。 最终,这也是完成的,但并没有使询问者感到安慰。


其次,该解决方案没有提供任何解决密钥管理问题的方法。 它们可以生成,但是存储完全落在开发人员的肩膀上。 在来自中国大陆的不同操作系统版本和设备上,所有围绕AndroidKeystore的行为都大打折扣。


这个城市需要一个新英雄


一切都照常进行,直到2018年夏天,我才发现Google提供了一个很棒的图书馆,如Tink 。 它非常容易学习,可以保护开发人员免受与密码学有关的大量细微差别。 使用这个库,几乎不可能做错什么。 此外,Tink可以完全控制键,并使用开发人员的AndroidKeystore抽象所有操作。


但是它仍然只是字符串加密。 在这里, Binary Preferences非常成功地出现了-我想看很长时间的一家国内制造商的库。 它允许您加密任何算​​法的所有存储数据-为此,编写两个接口KeyEncryptionValueEncryption的实现就足够了(分别用于键和值)。


结果,我们开始结合使用这两个库,并且很高兴我们的代码变得更加简洁易懂。


安全密码



现在,Google再次决定与开发人员会面,并简化他们在存储数据加密领域的工作。 宣布了另一个JetPack库来帮助解决此问题。 我想知道他们在那里写了什么具有革命性的东西,于是我爬上去寻找文档(破坏者:不是)。 我只在库中包含的类上找到了javadoc ,但也对此表示感谢。 事实证明,机会很少:文件加密,SharedPreferences和使用密钥。


为了测试库的功能,我编写了几段代码:


文件加密
val file = File(filesDir, "super_secure_file") val encryptedFile = EncryptedFile.Builder(file, this, "my_secret_key", EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB) .setKeysetAlias("my_test_keyset_alias") .setKeysetPrefName("keyset_pref_file") .build() val outputStream = encryptedFile.openFileOutput() outputStream.use { it.write("secret info".toByteArray()) } 

共享首选项加密
 val encryptedPreferences = EncryptedSharedPreferences.create( "super_secret_preferences", "prefrences_master_key", this, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) encryptedPreferences.edit().putString("secret", "super secret token") 

令我感到惊讶的是,一切都在第一次运行,而我却看到了他们为该库编写的代码。 进入源代码后,我看到它实际上是我们已经知道的Tink库的包装,并且正如我们为加密的BinaryPreferences编写的那样,编写的代码几乎是一对一的。


令我感到非常高兴的是,这次Google并未发明助力车,而是采用了自己完善的做法。 我们希望JetPack附带的security软件包将不仅限于该库,而是将进一步发展。


演示BinaryPreferences + Tink Bundle
安全加密库源代码
安全加密演示

Source: https://habr.com/ru/post/zh-CN452252/


All Articles