Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 创建一个安全的、基于web的密码管理系统,能够在用户之间共享数据_Ruby_Security_Encryption_Openssl_Public Key Encryption - Fatal编程技术网

Ruby 创建一个安全的、基于web的密码管理系统,能够在用户之间共享数据

Ruby 创建一个安全的、基于web的密码管理系统,能够在用户之间共享数据,ruby,security,encryption,openssl,public-key-encryption,Ruby,Security,Encryption,Openssl,Public Key Encryption,我为收到的Wall-O-Text提前道歉。这(至少对我来说)是一个相当复杂的问题,我花了很多心思。如果您愿意的话,您可以阅读我的问题并在Ruby中看到一个测试实现(非常仓促地构建,没有数据库支持,可能非常难看) 介绍 假设需要创建一个基于web的密码管理系统 (通过SSL!:)具有以下要求: 个人用户使用自己的唯一通行证登录到系统 短语 此通行短语应足以允许用户使用系统 有效地(例如,通过智能手机等)——关键是 应该不必随身携带密钥文件 用户可以在系统中存储任意长度的数据位(“条目”) 在数据

我为收到的Wall-O-Text提前道歉。这(至少对我来说)是一个相当复杂的问题,我花了很多心思。如果您愿意的话,您可以阅读我的问题并在Ruby中看到一个测试实现(非常仓促地构建,没有数据库支持,可能非常难看)


介绍 假设需要创建一个基于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在系统中存储一个条目

    • Bob输入一些数据作为条目与密码一起存储。 此数据将发送到服务器
    • 服务器生成一个密钥,用作AES-256加密的密钥
    • 服务器使用此密钥加密数据并将结果存储在
      enc_数据
      字段
    • 服务器为服务器生成基于哈希的消息身份验证代码 使用生成的密钥存储数据,并将其存储在
      data\u hmac
      字段中
    • 用于加密数据的对称密钥使用Bob的公共密钥加密 并存储在
      enc\u sym\u key
      字段中
    • 服务器使用Bob的私钥为服务器生成签名 对称密钥
    Bob检索其存储的条目

    • Bob输入他的密码和要检索的条目的ID
    • 服务器生成Bob密码和salt的SHA-256散列
    • Bob的加密私钥通过AES-256加密使用 散列
    • 服务器验证Bob的加密私钥是否未被加密 通过在
      priv\u-key\u-HMAC
      中检查HMAC进行篡改
    • 服务器解密存储在
      enc\u sym\u key
      字段中的对称密钥 使用Bob的私钥
    • 服务器验证加密的对称密钥是否未被篡改 通过使用Bob的公钥验证
      sym_key\u sign
      中的签名
    • 服务器使用对称密钥解密数据
    • 服务器验证加密数据是否未被篡改 通过验证存储在
      数据\u HMAC
      字段中的HMAC
    • 服务器将解密后的数据返回给Bob
    Bob与Alice共享一个条目:

    • Bob希望Alice能够访问他拥有的条目。他走进他的房间 密码和要共享的条目的ID
    • 使用“Bob检索”中的方法对条目的数据进行解密 他存储的条目。”
    • 为Alice创建新条目的方式与“Bob stores”中相同 系统中的一个条目,“但以下情况除外:
    • 条目的
      parent\u条目
      设置为Bob的条目
    • 对称密钥的签名是使用Bob的私有密钥计算的 密钥(因为Alice的私钥对Bob不可用)
    • 当Alice访问这个新条目时,非null
      parent\u条目
      导致系统使用Bob的公钥进行验证 签名(因为他的私钥用于创建签名)
    Bob更改其共享条目中的数据

    • Bob决定更改他与Alice共享的条目中的数据。上下快速移动 指示要修改的条目ID及其应包含的新数据
    • 系统将覆盖在“Bob在数据库中存储条目”中创建的数据 系统。”
    • 系统发现每个条目的父条目都与该条目相等 这是刚刚修改过的,每一个都会覆盖在中创建的数据 “Bob与Alice共享一个条目。”
    分析 优点:

    • 如果没有 拥有数据的用户的密码,作为 解密数据是使用用户的密码加密的,并且该密码 (及其散列)未存储在数据库中
    • 如果用户想要更改其密码,则只需更改其加密的专用密码 需要重新生成密钥(使用旧密钥解密私钥 密码/哈希