数据存储安全实践

细节

在移动设备上安全地存储数据需要恰当的技术。只要有可能,不要存储/缓存数据。这是避免设备上的数据泄露的最可靠的方法。

修复

请不要再任何可能的地方存储敏感数据。减少存储用户信息包括如下几项:

  • 传输和显示,但不要持久化到内存。还需要特别注意的是,确保数据不会通过截屏的方式泄漏到磁盘中。
  • 将数据存储在RAM中,程序关闭时就会清除。

额外层次的加密

如果在设备上存储敏感数据是应用程序要求,由于设备加密的不足,应该对设备添加额外的经过验证的第三方加密(例如SQLCipher)层。

通过添加另一层加密,你将对操作系统加密类的实现与攻击上有更好的控制。例如,攻击iOS数据保护类将不会对你的应用造成直接的影响。这种方法的缺点是比较复杂,如果实践不力,可能反而会降低安全性。如果你并不信任经过验证的第三方加密库,Apple和Android的通用加密库提供了许多标准加密功能,如果正确使用,可以提供合理安全的加密实现。

一些参考性的建议:

  • 使用SQLCipher对SQLite数据库中的敏感数据进行加密,它会使用PRAGMA密钥对整个数据库进行加密
  • PRAGMA密钥可以在用户初始化安装或第一次运行时生成
  • 为每个用户和设备生成独一无二的PRAGMA密钥
  • 秘钥的生成源应该具备足够的熵(避免从诸如用户名等容易预测的数据生成密钥)

无论何时加密用户数据,都要使用随机生成的主密钥对其进行加密。无论何时进行数据访问,该密钥也会由用户提供的密码进行加密保护。这可以防止攻击者从设备中提取主密钥。由于Apple数据保护API和钥匙串的漏洞数量,以及大多数Android手机缺乏设备加密,因此建议不要讲主密钥或密码存储在设备上。

Android

在Android中,请记住,SD卡等外部存储设备没有细粒度的权限。默认情况下,任何应用程序都可以读取存储空间并读取所有文件。自从Android 4.4起应用程序可以在某些情况下以受保护的方式在SD卡上存储数据(参阅https://source.android.com/devices/tech/storage/)。

Android和iOS实现的标准加密库,如AES,可用于保护数据。要注意的是,使用此方法加密的数据与用于导出秘钥和秘钥管理的密码具有相同的安全性。请考虑密码策略,长度、复杂性和用户便利性以及加密秘钥如何存储在内存中。通过root访问是可以转储正在运行进程的内存并搜索加密密钥。

另外,使用标准加密程序提供的AES通常默认为较不安全的AES-ECB。最佳做法是使用SecureRandom生成的256位密钥和随机IV来指定AES-CBC或AES-GCM。您还应该使用经过良好测试的PBKDF2(基于密码的密钥导出功能)从密码短语中导出密钥。

iOS

内置于iOS的数据保护API与复杂的密码相结合,可以提供额外的数据保护层,但却不如使用其他第三方验证的加密技术那样安全。为了使用这项技术,文件必须被标记为保护(请见6.1节 谨慎使用钥匙串)。未经Apple数据保护API明确加密的数据均以无加密的形式存储。

参考

results matching ""

    No results matching ""