KeepassHTTP:安全的API设计

前言

最近俺迫于找工作压力,好久没有更新Blog,被迫走上了刷Leetcode的苦逼生涯。找工作的间隙,探索了俺一直使用的Keepass密码管理软件,以及其提供HTTP服务的插件KeepassHTTP。无奈,该插件无法与Alfred保持很好的协作,因此,看能否弄一个Python的小脚本,集成到Alfred中,提高生产力。

KeepassHTTP协议

KeepassHTTP协议一句话描述为:通过URL获取密码的HTTP API。

首先,对于密码服务这种要求High Privacy的软件而言,为其设计一个API则首要考虑的必需为安全性的问题。目前,就俺知道的加密的两大类无非为Symmetric与Asymmetric两种机制,其中又以Symmetic最为常用。简言之,加密双方Offline协商好一个共同的Key。以后都用这把Key对所有的Message加密。而KeepassHTTP就是基于这种机制实现Key Exchange。

那简而言之,意味着,Client与Server(KeepassHTTP)都知道一个相同的Key。为了方便MultiUser,我们对于每把Key,都用一个Key Id区分。
{
    "Test Key":"1c3a2......",
    "Another Key":"2d84c......"
}


客户端REQUEST


在KeepassHTTP中,客户端的请求为如下的格式。


该API为HTTP POST请求,因此并非业内所常见的RESTFul设计。但是其在安全性方面还是做了不少功夫。
Nonce字段:设计Nonce字段的根本目的在于防止重放攻击。
俺曾经调研过锅内某信的Web API,其实也是有该字段的,不过叫做Random,其实是一个道理。本质上,做到一次请求一个Nonce。而在KeepassHTTP中,该字段是由一个随机字符串,Base64编码而成。

Verifier字段:用于签名(识别合法客户端)。
在KeepassHTTP协议中,采用了AES-CBC加密模式。一般来说,AES-CBC的算法通常由,Init Vector(IV),AES-KEY,与Data组成。因此,实现中利用Nonce做Init Vector,Nonce做Data,同时TEST Key做AES-KEY来实现对于Nonce的签名后,BASE64编码。
服务器收到Verifier字段后,通过同样的操作比对解密后的Verifier字段与Nonce字段是否匹配来验证客户端的请求。

URL字段:真正的Data
直接利用Nonce,AES-KEY,与真正的Url加密得到,再利用Base64进行编码。

服务器RESPONSE

当服务器通过Verifier字段验证了客户端的合法性后,便在数据库中查询与URL匹配的Data返回了,其返回值如下图。
对于上面的返回值,客户端需要做的首先对Nonce与Verifier做验证,证明该请求来自于正确的服务器。值得注意的是,Response的Nonce与Request的Nonce并不相同,这里还是为了防止重放所做的设计。
其次,对于每条Entries的所有值,利用AES-KEY做解密操作,拿出对应的密码。

No comments:

Post a Comment