L 记事本

关于密码备份

   #流水账 #日常 #工具 #加密 #笔记 

前段时间,由于手机系统升级,重装两步验证app (微软Authenticator),印象中这个软件是会同步数据到icloud, 大意了,就没备份,结果这软件竟然无法从iCloud备份恢复,一顿操作把备份弄没了 :( M$这套同步逻辑是在弄不明白。

然后就是所有的坏事情同时发生,bitwarden无法登录,注销账号后重新导入原来导出的 加密json,提示无法导入。

万幸,一台电脑上有备份数据,断网,登入,导出明文json。

经过此事,我决定以后定期导出明文的json,自己加密,通过邮箱自动备份。

本来以前有一个mac的工具,自动备份,其他设备上无法运行,而且太重量级

写了一个简陋的网页版本

第一次使用,生成专门的书签链接

  1. 输入备份json的密码
  2. 生成书签链接 区域,
    1. 输入邮箱。(多个可以使用英文逗号,分隔)
    2. 邮件标题 “密码备份”
    3. 输入密码前缀,(这里就用 bitwarden的邮箱,#结尾)
  3. 点击 生成书签链接(使用密码短语派生的公钥) 这个链接
  4. 将生成的链接保存做书签。

以后使用就直接打开书签链接

  1. 将导出的明文json放到 明文输入框中,
  2. 点击 发送加密结果到邮件 会生成加密内容,并打开一个邮件app,(我设置的outlook.com) 发送邮件。

下面是该网页的README,备份下


这是用来做什么的?

定期导出密码管理器的密钥加密备份,发送到邮箱。

以前搞丢过bitwarden的两步验证,只能删掉账号。
定期导出管理器的密钥 将公钥放到链接里面,方便每次备份,不用每次输入短语

带入参数

通过页面的一对密钥对 解密hash里面的data,解密成一个json

私钥 yNmVrcoS5D4xMTvjAPSkZe57HZqPZoIUxznm+SqWKFo=
公钥 dTj41nmwoLcguLpM9AntyKgg67xx6K4UAxc27CLIcFw=

json结构

{
    prefix:string  
    pubkey:string
    toEmail:string
}

|字段|说明|其他| |-|-|-| |prefix|密码短语的前缀(建议邮箱后面加上#),和密码短语一起生成密钥对|可为空| |pubkey|传入的默认公钥,用来加密| |toEmail|生成mailto链接,发送加密的结果作为备份| |emailSubject|邮件主题|

通过hash 带入参数

https://webecc.pages.dev/#&data=BAAQACAAIAB3v4SZnpkL7YvNQK4Up1anEtK61zy7RWgCxTKz1jpp9oH8QLfqdbqAZRFcNnHvqYHnqfx91GT1hvch7LdnMM6c88W6QV5V56fpWLcXU5jXVWv%2BiZY4P3INk%2FJw6o5NtVJhYTHFK0UcXb7hLdx7GCaTIgWg0Zon3%2B9BIEaspj8c166yRsjD5TeZb5IWUjzPUGaxb1vQ3FCQH%2FRE6MLcf7S2hhMUT2yJzXaoqJIUMOnHtbcPmY4BpN6trjItVlE0rJkZsreBRybrcrMXyzdasklMLpk2LVcY5G4noZDRnY93nESSKkerOv%2Fs4nz82fvJjEzY%2F%2FRcAoy7JP%2BgOlvXSsUp

格式说明

结构

2字节 2字节 2字节 2字节 IV MAC 随机公钥 加密数据

下面short都是小端模式

  • 1-2字节short 意义
    • 4:先gzip后加密
    • 5:直接加密
  • 3-4字节的short值表示 iv的长度 ,16
  • 5-6字节的short值表示 mac校验hash的长度 32
  • 7-8字节 字节表示临时公钥长度 ,32
  • IV // 随机生成
  • MAC ,//最后计算生成
  • tmpPubKey //随机生成公钥私钥,私钥(tmpSecKey)使用后丢弃
  • EncryptData

过程

生成临时公钥私钥 tmpSecKey , tmpPubKey

sharedX(32 byte)= publickKey • tmpSecKey 

buffer[96];
copy sharedX  => buffer[0..31]

/**
* 下面公钥按照小端模式比较,先比较高位置,再比较低位
*/
if tmpPubKey > publickKey  
    copy publickKey => buffer[32...63]
    copy tmpPubKey => buffer[64...95]   
else  
    copy publickKey => buffer[32...63]
    copy tmpPubKey => buffer[64...95]    
end  

利用hash算法 blake2b 生成64字节长度digest
digest = blake2b(buffer)

其中 digest[0..31] 作为 AES-CBC 的密钥 aesKey,使用IV 一起加密密钥生成 加密数据 EncryptData

其中 digest[32,63]作为计算mac的密钥 HKEY,输出32字节数据

也是采用blake2b,指定输出32字节,key = HKEY

mac = blake2b(IV + tmpPubKey + EncryptData)


根据密码短语生成密钥

步骤

  1. prefix(如果有) + 密码短语 作为 key = prefix + phrase
  2. PBKDF2(key) 生成32 字作为私钥, secKey = PBKDF2(key)
  3. 根据私钥生成 密钥对

PBKDF2 参数

PBKDF2参数 value
salt The California sea lion (Zalophus californianus) is a coastal species of eared seal native to western North America. It is one of six species of sea lion. Its natural habitat ranges from southeast Alaska to central Mexico, including the Gulf of California. This female sea lion was photographed next to a western gull in Scripps Park in the neighborhood of La Jolla in San Diego, California. [2022-04-07 wikipedia]
iteration 123456
hash SHA-256
outLen 256bit