我在闲暇时间一直在玩OpenPGPjs(Javascript port of OpenPGP)来学习新东西。为了测试它,我正在开发一个简单的Web应用程序来存储和检索数据库中的密钥对和加密数据。
由于OpenPGPjs有一个选项来生成“装甲”键(二进制键作为文本输出),我想将它保存在数据库中。但是在生成密钥对时,我注意到它们不是固定长度的(正如我错误地假设的那样)。密钥的可变长度让我对数据库中字段大小选择的限制感到困惑。
有人可以澄清对OpenPGP的以下怀疑:
- > OpenPGP'装甲'密钥可以拥有的最大大小是多少?
- >可以根据加密数据的大小计算加密数据的大小吗?
- >在数据库中存储这些密钥的一般推荐做法(如果有的话)是什么?
P.S:我已阅读并了解pitfalls of using Javascript for encryption,因此您可以跳过该警告。 :)
注意:根据评论,我编辑了这个问题,希望能消除我想知道的任何歧义。
答案 0 :(得分:1)
密钥长度是您选择的 - 如果您使用当前建议,可能是4096位。 Base64对其进行编码并将其保存为varchar。
加密数据的长度完全可变。 IIWM我将base64编码并将其写入磁盘。将结果文件名保存在表中而不是实际数据中。
答案 1 :(得分:1)
无法预测(公共/私有,无关紧要)密钥和加密数据的长度。如果要将它们存储在数据库中,请以BLOB
或TEXT
(而不是VARCHAR
进行存储,不需要任何索引,并且会以相当稀疏的数据布局结束。您可能想要放弃一些规范化并将密钥ID(或指纹)单独存储为VARCHAR
,如果您需要查询它。
ASCII装甲数据更容易处理,而二进制数据更紧凑。
对于加密数据,很容易看出加密长度在很大程度上取决于输入,而且选择了哪种加密和压缩算法 - OpenPGP允许很多加密和压缩算法。由于压缩不应(显着)增加存储,并且对称加密至少应该是线性的,如果不相等,并且元数据或多或少是固定大小,您可以轻松地为您的特殊集合确定一些上限算法。对于存储在数据库中,这可能是无关紧要的,因为长度对于合理的内联存储来说太大了。
对于密钥包,它取决于您要存储的内容:除了公共主键外,通常还会存储几个公共子密钥(实际用于加密)。公钥还包含用户ID,可能是图像,可能是某些配置,吊销证书和传入签名。公钥通常可以变得相当大,不信任最大尺寸。私钥也是如此,它通常捆绑了公钥。理论上,大小可以是任意大的(至少我不知道指定RFC中的任何限制)。