这两天在探索 bitwarden api,自己实现客户端的时候遇到了一个奇怪的问题
服务端用的是 vaultwarden (也就是以前的 bitwarden_rs ),用了 aes-256-cbc-hmac-sha-256 做字段加密,登录的时候要在本地根据用户名和密码以及服务器给的参数生成 prelogin key ( aes ),用这个 prelogin key 登录之后会给到一个 encryption key ( aes ) 用于字段解密,这个 encryption key 可以通过 hkdf 衍生出对加密字段签名时候用的 hmac key 。
用衍生出来的 hmac key 对原来包含 encryption key 的消息进行验证是可以通过的,用 encryption key 解出来的数据也是对的,但是用这个衍生出来的 hmac key 怎么都没办法验证通过消息的 mac:
https://github.com/arhat-dev/credentialfs/blob/97e36b446340e4907d2750361272a63c7b44ed81/pkg/pm/bitwarden/crypto.go#L56有没有了解 bitwarden 数据解密过程的帮忙指点一下我哪里出问题了,一直找不到什么头绪(甚至已经开始怀疑在 node/rust 中 hmac 对 cbc padding 部分签名的处理和 golang 不对应了)