我在业余时间一直在玩OpenPGPjs(theJavascript port of OpenPGP)来学习新东西。为了测试它,我正在开发一个简单的web应用程序来存储和检索数据库中的密钥对和加密数据。
由于OpenPGPjs有一个生成“装甲”密钥(以文本形式输出的二进制密钥)的选项,所以我希望将其保存在数据库中。但是在生成密钥对时,我注意到它们不是固定长度的(正如我错误地假设的那样)。键的可变长度使我混淆了在数据库中选择字段大小的限制。
有人能澄清以下对OpenPGP的疑问吗
OpenPGP装甲钥匙的最大尺寸是多少?
->加密数据的大小是否可以根据加密数据的大小来计算?
->一般情况下,建议在数据库中存储此类密钥(如果有)。
备注:我已经阅读并理解了pitfalls of using Javascript for encryption,所以您可以跳过这个警告。:)
注:根据评论,我已经编辑了这个问题,希望能消除我想知道的任何模棱两可的地方。

最佳答案

无法预测(public/private,无关紧要)密钥和加密数据的长度。如果要将它们存储在数据库中,请以BLOBTEXT的形式执行此操作(不需要VARCHAR,不需要任何索引,而是以稀疏的数据布局结束)。如果您需要查询密钥ID(或指纹),您可能需要放弃一些规范化,并将其单独存储为VARCHAR
ASCII装甲数据更容易处理,而二进制数据则更紧凑。
对于加密的数据,很容易看出加密的长度很大程度上取决于输入,而且还选择了哪些加密和压缩算法——OpenPGP允许很多算法。由于压缩不应该(相当大)增加存储量,而且对称加密至少应该是线性的,如果不相等,并且元数据或多或少是固定大小的,所以您可以很容易地为您的特殊算法集确定一些上限。对于存储在数据库中,这可能是不相关的,因为长度太大,无法进行合理的内联存储。
对于密钥包,这取决于要存储的内容:除了公共主键之外,通常还会存储几个公共子密钥(它们实际上用于加密)。公钥还包含用户ID、图像、配置、吊销证书和传入签名。公共密钥通常增长较大,不信任最大大小。对于私钥也是如此,私钥通常捆绑了公钥。大小理论上可以是任意大的(至少我不知道在指定的RFC中有任何限制)。

10-06 05:39
查看更多