Ruby:使用私钥/公钥进行文件加密/解密

tik*_*tak 21 ruby encryption ruby-on-rails encryption-asymmetric public-key-encryption

我正在寻找一种文件加密/解密算法,它满足以下要求:

  • 算法必须可靠
  • 对于相当大的文件,算法应该很快
  • 私钥可以通过某些参数生成(例如,密码)
  • 生成的私钥必须与公钥兼容(公钥只生成一次并存储在数据库中)

是否有建议算法的Ruby实现?

bri*_*ice 32

注意:正如评论中提到的浮雕一样,这个答案很适合实际系统.首先,不应使用此方法执行文件加密(例如,lib提供AES).其次,这个答案并未解决任何影响您如何设计解决方案的更广泛问题.

原始资料也涉及更多细节.

Ruby可以使用openssl来做到这一点:

#!/usr/bin/env ruby

# ENCRYPT

require 'openssl'
require 'base64'

public_key_file = 'public.pem';
string = 'Hello World!';

public_key = OpenSSL::PKey::RSA.new(File.read(public_key_file))
encrypted_string = Base64.encode64(public_key.public_encrypt(string))
Run Code Online (Sandbox Code Playgroud)

并解密:

#!/usr/bin/env ruby

# DECRYPT

require 'openssl'
require 'base64'

private_key_file = 'private.pem';
password = 'boost facile'

encrypted_string = %Q{
...
}

private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file),password)
string = private_key.private_decrypt(Base64.decode64(encrypted_string))
Run Code Online (Sandbox Code Playgroud)

这里开始

  • 对不起,这是非常糟糕的建议.OP讨论文件加密/解密,你永远不应该使用RSA. (4认同)
  • 只是想添加文件应该用例如AES-256进行ecnrypted,但它的密钥应该用rsa发送. (3认同)
  • 我实际上不是Rubyist,但那些电池非常好.我想知道python中的等价物会有多难... (2认同)

emb*_*oss 11

我担心你在这里混合了两个概念,即身份验证/授权和机密性,试图在一个步骤中涵盖这两个方面,这是行不通的.您永远不应该使用非对称算法加密"真实数据".a)它们太慢了,b)有一些微妙的问题,如果做得不好,将严重削弱你的解决方案的安全性.

一个好的经验法则是,您应该最终使用私有对称密钥进行加密,这是由更快的对称算法使用的对称密钥.但在几乎所有情况下,你甚至不应该这样做,因为在你真正想要的90%的病例是在这些情况下,TLS(SSL) -我试图解释为什么这里前一阵子.

在您的情况下,我认为要求是:

  • 要存储在数据库中的数据的机密性:一般公众不应该能够读取它(甚至访问它)

  • 选定的少数人(可能只是一个人)应该能够访问和读取该数据

通常通过使用对称加密来实现第一个目标.第二个目标虽然是相关的,但却是通过完全不同的方式实现的.您希望访问该文件的用户进行身份验证(即建立身份),最重要的是您还希望他们获得授权(即检查已建立的身份是否有权按照他们的意图执行).这是非对称密码术可能进入阶段的地方,但不一定如此.由于你的问题用Rails标记,我假设我们正在讨论Rails应用程序.您通常已经有一些方法来对那里的用户进行身份验证和授权(很可能涉及上述TLS),您可以简单地重用它们以便为实际文件加密/解密建立对称密钥.如果您想要避免不对称加密,基于密码的加密将适合此目的.如果您还想确保已经保密的数据的完整性,事情变得更加复杂,也就是说,您希望为经过身份验证和授权的用户提供一种保证,即他们最终访问的内容没有以任何方式被更改同时.

为此制定解决方案将不是一件轻而易举的事,并且在很大程度上取决于您的要求,所以我担心没有适合每个人的"黄金方式".我建议做一些研究,更清楚地了解你想要达到的目标和方法,然后尝试获得有关你仍感到不确定/不舒服的主题的额外建议.

  • 那是正确的方向!但它仍然容易受到重播攻击.而不是发送由非对称密钥包装的密钥,你不能使用TLS吗?我发现在几乎所有将数据从A传输到B的情况下,您应该使用TLS而不是非对称加密 - TLS可以保护您免受最有可能破坏自定义协议的攻击. (2认同)