Ruby 创建一个安全的、基于web的密码管理系统,能够在用户之间共享数据
我为收到的Wall-O-Text提前道歉。这(至少对我来说)是一个相当复杂的问题,我花了很多心思。如果您愿意的话,您可以阅读我的问题并在Ruby中看到一个测试实现(非常仓促地构建,没有数据库支持,可能非常难看)Ruby 创建一个安全的、基于web的密码管理系统,能够在用户之间共享数据,ruby,security,encryption,openssl,public-key-encryption,Ruby,Security,Encryption,Openssl,Public Key Encryption,我为收到的Wall-O-Text提前道歉。这(至少对我来说)是一个相当复杂的问题,我花了很多心思。如果您愿意的话,您可以阅读我的问题并在Ruby中看到一个测试实现(非常仓促地构建,没有数据库支持,可能非常难看) 介绍 假设需要创建一个基于web的密码管理系统 (通过SSL!:)具有以下要求: 个人用户使用自己的唯一通行证登录到系统 短语 此通行短语应足以允许用户使用系统 有效地(例如,通过智能手机等)——关键是 应该不必随身携带密钥文件 用户可以在系统中存储任意长度的数据位(“条目”) 在数据
介绍 假设需要创建一个基于web的密码管理系统 (通过SSL!:)具有以下要求:
+------------------------------------------------------------------------------+
| users |
+---------+--------------+--------------+---------------+----------------------+
| salt | pub_key | enc_priv_key | priv_key_hmac | |
+---------+--------------+--------------+---------------+----------------------+
| entries |
+---------+--------------+--------------+---------------+----------+-----------+
| user_id | parent_entry | enc_sym_key | sym_key_sig | enc_data | data_hmac |
+---------+--------------+--------------+---------------+----------+-----------+
基本用例
让我们想象一下系统的两个用户,Alice和Bob
Bob注册该网站:
- 鲍勃输入密码。此密码将被发送到服务器(但不是 存储的)
- 服务器生成一个随机salt并将其存储在
字段中salt
- 服务器生成Bob密码和salt的SHA-256散列
- 服务器生成一个RSA密钥对。公钥存储为普通密钥
字段中的文本。私钥通过AES-256加密 使用Bob的密码和salt生成的哈希作为密钥 存储在发布键
字段中enc_priv_key
- 服务器为Bob的邮件生成基于哈希的消息身份验证代码
使用Bob的密码和salt作为密钥的私钥,并将其存储在
字段priv\u key\u hmac
- Bob输入一些数据作为条目与密码一起存储。 此数据将发送到服务器
- 服务器生成一个密钥,用作AES-256加密的密钥
- 服务器使用此密钥加密数据并将结果存储在
字段enc_数据
- 服务器为服务器生成基于哈希的消息身份验证代码
使用生成的密钥存储数据,并将其存储在
字段中data\u hmac
- 用于加密数据的对称密钥使用Bob的公共密钥加密
并存储在
字段中enc\u sym\u key
- 服务器使用Bob的私钥为服务器生成签名 对称密钥
- Bob输入他的密码和要检索的条目的ID
- 服务器生成Bob密码和salt的SHA-256散列
- Bob的加密私钥通过AES-256加密使用 散列
- 服务器验证Bob的加密私钥是否未被加密
通过在
中检查HMAC进行篡改priv\u-key\u-HMAC
- 服务器解密存储在
字段中的对称密钥 使用Bob的私钥enc\u sym\u key
- 服务器验证加密的对称密钥是否未被篡改
通过使用Bob的公钥验证
中的签名sym_key\u sign
- 服务器使用对称密钥解密数据
- 服务器验证加密数据是否未被篡改
通过验证存储在
字段中的HMAC数据\u HMAC
- 服务器将解密后的数据返回给Bob
- Bob希望Alice能够访问他拥有的条目。他走进他的房间 密码和要共享的条目的ID
- 使用“Bob检索”中的方法对条目的数据进行解密 他存储的条目。”
- 为Alice创建新条目的方式与“Bob stores”中相同 系统中的一个条目,“但以下情况除外:
- 条目的
设置为Bob的条目parent\u条目
- 对称密钥的签名是使用Bob的私有密钥计算的 密钥(因为Alice的私钥对Bob不可用)
- 当Alice访问这个新条目时,非null
导致系统使用Bob的公钥进行验证 签名(因为他的私钥用于创建签名)parent\u条目
- Bob决定更改他与Alice共享的条目中的数据。上下快速移动 指示要修改的条目ID及其应包含的新数据
- 系统将覆盖在“Bob在数据库中存储条目”中创建的数据 系统。”
- 系统发现每个条目的父条目都与该条目相等 这是刚刚修改过的,每一个都会覆盖在中创建的数据 “Bob与Alice共享一个条目。”
- 如果没有 拥有数据的用户的密码,作为 解密数据是使用用户的密码加密的,并且该密码 (及其散列)未存储在数据库中
- 如果用户想要更改其密码,则只需更改其加密的专用密码 需要重新生成密钥(使用旧密钥解密私钥 密码/哈希