非密码学专业,工程角度分析

简述

在某些场景需要某个进程,在本地存储或管理一些及其敏感的信息,比如

  • 用户生物识别 信息(指纹、人脸、虹膜等)
  • 用户身份凭证(比如:浏览器 Cookie),用户密码等(下文称第二类信息)

针对 用户生物识别 信息,一般需要设计专门的硬件设备进行本地化管理和存储,不在本文讨论范围

而对第二类信息的存储管理),需要专门的机制来保证安全性。注意本文仅讨论数据存储在本地的场景。

需求

针对第二类信息的存储和管理的一般需求如下:

  • 在设备断电后,数据不能丢失
  • 有专门的进程来管理这些信息(下文称为管理进程)
  • 其他进程永远无法直接读取这些信息,只能请求管理进程获取这些信息,且需要用户明确授权

案例调研

1Password

官方关于安全的介绍

可以得知,1Password 的本地数据是通过 主密码 通过 AES-256 算法,进行加密的。

参考: 博客

  • 存储在 用户数据目录 的Cookies 文件,该文件为 一个 SQLite3。Cookie 指 存储在 encrypted_value 字段中
  • encrypted_value 是经过 AES-256 算法加密过的密文,其加密 key 存储在
    • Windows,当前用户的ProtectedData中;
    • Linux,固定的密钥或钥匙链;
    • Mac,钥匙链;

Google Chrome 密码存储

类似于 Cookie 存储

核心技术 AES-256

AES 是一个非常著名的 对称加密 算法,可以参考 维基百科

关于 AES-256 可能受 美国的加密技术出口管制 的 管制。最著名的例子就是 JDK 中 JCE 中 AES-256 的使用

实现

同样,我们按照 如上 案例中的 思路实现 一个管理进程即可:

  • 信息使用用户提供的密码使用 AES256 存储在本地文件中
  • 第一次其他进程向该进程请求该信息,确认是否授权,若是,进程将提示用户输入密码,解密并返回

防止暴力破解

为了防止暴力破解,可以使用不直接用 用户密码 加解密,而是通过 耗时hash(salt(用户密码)) 作为加解密的 key。

耗时hash,术语称 密码 hash,参见知乎文章