如何使用私钥加密完全加密Ruby中的数据?

khe*_*lal 5 ruby security encryption public-key private-key

首先,我们系统的一些信息,基本上是建筑行业的eTendering解决方案.

所以:

  • 项目清单
  • 我们的系统有多家公司
  • 每家公司都有多个用户
  • 每家公司都可以创建多个拍卖
  • 然后,其他公司可以为可用的拍卖提交出价.出价包含数百或数千个单独的项目,我们只需要加密这些记录的"价格"部分.

我们面临的问题是,我们的大客户不希望我们能够获得投标价格,至少在投标正在进行时,这是完全可以理解的.现在,我们只是通过对称加密来加密价格,因此即使价格在数据库中有效加密,他们担心的是我们有解密价格的关键.

因此,我们正在研究某种形式的公钥加密系统.以下是我们对解决方案的初步想法:

  1. 当公司注册时,我们使用OpenSSL为它创建公钥/私钥对,并将其保存在S3中或直接保存到数据库中.为了真正有用,我们会强制用户使用私钥的强密码,这当然不会保存在数据库中.
  2. 当公司提交拍卖竞标时,我们使用拍卖所有者公司的公钥加密价格,然后将它们保存到数据库中.
  3. 当拍卖竞标期结束并且发行公司想要第一次生成报告时,我们要求他输入密码并将其与公司的私钥一起用来解密价格.
  4. 为了使后续流量更快,我们缓存解密数据(并可能使用简单的对称加密系统对其进行加密)

所以这里有问题(我们很遗憾不是安全专家,如果这些是愚蠢的问题,那就很抱歉):

  • 这有什么意义,还是一个完全荒谬或过度杀伤的解决方案?
  • 我们会使用OpenSSL,OpenPGP或其他解决方案生成密钥吗?
  • 如果用户想要更改密码或生成新密钥会发生什么?除了使用新密钥解密/重新编码所有内容之外别无他法吗?
  • 这个解决方案会有什么陷阱?
  • 有没有更好的解决方案可以推荐?

Dus*_*and 5

所以这是我的建议,如果你想用加密来解决这个问题......

  • 每个用户每个公司应生成OpenPGP(或GnuPG)非对称公钥/私钥对
  • 应将每个公钥上传到公钥服务器
  • 公司可以选择" 签署 "各个用户的公钥,以指定与这些用户的信任关系(如果该关系发生变化,则撤销该签名)
  • 拍卖师或非党派仲裁者还将生成密钥对并将该公钥推送到公钥服务器
  • 作为拍卖注册过程的一部分,每个用户将导入拍卖者的公钥,并且拍卖者将导入每个用户的公钥.
  • 受信任的第三方(可能是拍卖商之外的SaaS供应商)将托管用户和拍卖商通过其进行通信的服务
  • 出价用户会按以下方式创建出价
    • 使用私钥签署出价
    • 将他们建议的价格加密为两个密钥:他们自己的公钥拍卖人的公钥
    • 将其出价提交给受信任的第三方服务,该服务需要对在拍卖到期前检索出价的任何用户实施禁运
  • 在拍卖结束时,只有在拍卖结束后,拍卖师才会检索所有出价,对其进行解密并验证签名.

几个关键点:

  • 在服务中共享或存储任何用户或公司私钥都是至关重要的 - 这是我在您的问题中提出的方法中唯一真正的"缺陷".如果是这种情况,一个用户很可能会指责管理员"欺诈"或"篡改"出价,因为您的服务器管理员最终可以访问所有用户的私钥,因为您已经自己生成它们.
  • 同样,任何所有通信和"出价"都必须由每个用户以真正的私钥加密"签名" .这是你将如何知道一个出价从一个特定的用户,来到只有该用户,以及出价不可能被篡改.
  • 将出价加密到出价用户和拍卖者的公钥,确保第三方SaaS供应商在拍卖开放期间的中断期间没有对出价本身进行内省.我认为这是解决问题的最重要的一点.
  • 请注意,实际上可能最好将每个出价加密到所有出价用户的一个环,如果按照设计,您希望在拍卖结束后公开所有出价.这将是对我的算法的略微修改,如上所述.

为了充分披露并且可能是一些微妙的营销,我碰巧是一家名为Gazzang的公司的架构师和首席技术官,该公司已经实施了一个名为zTrustee的产品,其运行完全如上所述;-)


Nev*_*vir 4

需要明确的是:我有一种预感,您的客户可能不愿意牺牲让您的系统管理某些加密技术所带来的所有便利;您可能应该提出几种选择以及它们的缺点与便利性。

一般要点

首先,您首先从一个明确的威胁模型开始,涵盖您能想到的每种可能的攻击。即使您选择不解决某些攻击(处理所有攻击是不现实的),您也会找出更明显的攻击,并且至少有一组基本步骤来处理其他攻击(如果发生)。

回复:这有什么意义吗?

我认为一般前提虽然对客户来说有些过分,但从安全角度来看是有道理的。您的客户想要一个加密安全的系统;很公平。

但是,关于您提出的解决方案的一些要点:

  • 通过允许客户通过网络传递密码,攻击者(您的客户似乎认为可能是您)只需操纵该密码即可访问定价数据。

    • SSL 有助于缓解这种情况,但沿线某个地方的错误日志行很可能会意外暴露客户端的密码。

客户确保无法访问定价数据的唯一真正加密安全的方法(据我所知)是对其进行加密,而您的系统只是充当加密数据的代理实际上,这使您成为加密数据包和公钥的中间人,但您的系统永远不应该看到私钥。

问题是:客户是否愿意管理自己的密钥,或者这对他们来说太麻烦了?您至少可以自动化其中的大部分(客户端应用程序/网站将处理在本地存储私钥,并且还将负责收集其他感兴趣方的公钥以解密他们的加密出价)

回复:我们会使用 OpenSSL、OpenPGP 或其他解决方案生成密钥吗?

其实这并不重要;这些选项中的每一个都只是定义公钥/私钥和任何元数据的容器格式。使用最适合您的语言/平台的一种。

主要决策点应该是哪种加密算法和密钥强度:RSA-2048?RSA-4096?椭圆曲线?还有别的东西吗?

特定于 Ruby:您可能只想使用OpenSSL库,因为它是标准库的一部分。但重申我上面的观点:如果您的服务器永远看不到私钥,那就更好了(如果客户端可以在更好的安全性和便利性之间进行权衡)

回复:如果用户想要更改密码或生成新密钥会怎样?

更改密码很简单:私钥本身只是使用某种对称算法加密的。更改密码涉及解密现有密钥,并使用新密钥重新加密。如果客户丢失密码,则无法恢复。

生成新密钥可能更安全,但需要您更加勤奋(加密的有效负载需要识别它们匹配的密钥,并且客户端一次可能有多个活动密钥)。不过,这是一件好事;定期轮换密钥是一种常见的做法,即使它们没有受到损害。