本文提纲,请根据需要自行跳过


最简加 / 解密流程


encrypt

问题:密钥如何生成,如何保存?

  1. 用户输入密码,根据密码生成密钥进行加密: 这种方式更加安全,密码不进行存储,则只要密码不泄露,即使拿到加密内容也很难解密。但每次解密均需要输入密码,且密码丢失将无法恢复文件。
  2. 为用户生成密钥并将密钥存储在本地: 这种方式可通过一些方便的验证机制(如:图案、指纹验证等)取得密钥后直接解密。不过,一旦存储密钥的安全机制被攻破,则会被轻易解密。


让密钥更安全


对于方式1,生成密钥我们一般采用md5+salt(加盐)的方式。
对于方式2,密钥安全依赖于本地的存储安全机制,一旦本地的安全机制被攻破,则会带来非常大的隐患。

为了让密钥更加安全,我们通常会对密钥进行加密处理后再存储,解密文件时需要先解密出密钥:

encrypt

但我们如何对密钥进行加密,在哪里进行加密? 最直接的就是在程序中直接进行加密,而要解密文件时再对密钥进行解密,虽然这种方法简单粗暴,但如果能做到以下几点,也不失为一种足够安全的方式:

  • 封装/混淆加密解密的代码使得很难甚至无法从反编译后的代码中获得
  • 加密解密的代码藏的足够深,并使用迷惑性的命名及逻辑
  • 原始的加密解密代码中参杂一些错误,在一些不相关的逻辑中加入一些对加密解密的修正

做到以上几点,则可以逐一过滤以下攻击

  • 能够获取加密后密钥但无法反编译出程序代码的攻击
  • 反编译出程序代码无法找到加密解密代码的攻击
  • 找到加密解密代码但未能找到对加密解密进行修正的攻击

通过以上手段,对于基本的加密文件安全性已经有了很好的保障。


让解密好用些


对于方式1生成的密钥,只能通过用户输入密码进行解密,虽然繁琐但却安全。
对于方式2生成的密钥,则需要一定的验证机制进行获取再解密。在有指纹验证的设备上,使用指纹验证无疑是一个很好的方案,则取得密钥的流程如下:

encrypt


大文件加 / 解密优化


现在我们多是使用AES对文件进行加密,几KB或者几十KB的文件在加解密时不会有明显的感觉,无需优化。但解密几MB甚至几十MB的文件就会有很大问题,根据设备性能的差异几十秒甚至几分钟都有可能,加密时可以放到非主线程中在后台完成,而业务流程是需要等解密完成才能进行后续操作的,如何加速加密解密?

  • 后台加密,提前解密:

    部分应用可通过优化交互流程将加密放在后台线程中进行,在使用数据前提前解密,通过验证后直接提供解密好的数据。该方案适用场景较窄,优点是不会增加太多复杂度。

  • 分割文件多线程加密,多线程解密后合并文件:

    将文件分割为多块后在后台的并行线程中进行加密,解密时将多块加密后的文件在后台的并行线程中解密,解密完成后再进行合并。该方案优点是可通用于各种场景,但会为整个加密/解密流程增加不小的复杂度,不过增加解密的复杂度后,也提高了安全性。推荐使用该方法。 encrypt