Skip to content

给自己做一个1password:安全设计方案(二)

>

密码保护流程

一个密码管理软件的核心就是:

1、用户只记住一个密码:主密码。

2、用户所有的信息都需要用此密码去加密保存。

所以 主密码很重要,如果泄露了,那就没有任何安全性。

但如果让一个普通用户去记住一个很复杂的 主密码是不现实的,怎么办呢?

参照1password的解决方案是:

1、软件生成一个复杂的key(25个随机字符)和用户的主密码拼在一起生成一个新密码,可以叫根密码。

2、通过hash算法对根密码加密,生成一个唯一的hash值 (使用SHA-256 算法)

3、用上面生成 的hash值作为密钥去对用户信息去加密。

这样做的目的是

1、提升了主密码的复杂性,用户只用记住一个简单的密码即可。

2、即便黑客通过加密后的数据推测出加密所使用的密钥,也无法推导出主密码(鉴于 hash 算法具有不可逆性)

信息加密流程

加密信息,采用目前通用的高安全性的 AES-256 算法

AES-256 算法特点:

  1. 安全性高:使用 256 位密钥,提供了强大的加密保护。
  2. 高效性:加密和解密的速度相对较快,适合处理大量数据。
  3. 灵活性:支持多种不同的工作模式,如 ECB、CBC、CFB 等。

为了安全,我采用cbc模式

CBC 模式:

  • 特点:

    • 引入了初始化向量(IV),每个分组的加密依赖于前一个分组的密文。
    • 避免了 ECB 模式中相同明文分组产生相同密文分组的问题。
  • 缺点:

    • 加密过程不能并行处理,因为每个分组的加密依赖于前一个分组。

流程

每次保存数据到本地数据库时,都将需要加密的字段加密后保存。

软件读取数据时,再使用用户提供的主密码进行解密。

这样就保证了,明文只出现在程序的内存中。硬盘中保存的始终是密文。

数据存储方案

为了保证数据安全,数据需要存储在自己的电脑上。

所以需要使用一个本地的数据库,目前流行的是sqlite(微信和svn等软件都使用)

当需要同步到其它设备时,软件可以将数据同步到用户的网盘。

再从网盘拉取。

全文完