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

Ruby on rails Ruby:使用私钥/公钥进行文件加密/解密,ruby-on-rails,ruby,encryption,public-key-encryption,encryption-asymmetric,Ruby On Rails,Ruby,Encryption,Public Key Encryption,Encryption Asymmetric,我正在搜索满足以下要求的文件加密/解密算法: 算法必须可靠 对于较大的文件,算法应该是快速的 私钥可以通过某些参数(例如密码)生成 生成的私钥必须与公钥兼容(公钥只生成一次并存储在数据库中) 建议的算法是否有Ruby实现 注意:正如浮雕在评论中提到的,这个答案不适合实际系统。首先,不应使用此方法执行文件加密(例如,lib提供AES)。第二,这个答案没有解决任何更广泛的问题,这些问题也会影响到您设计解决方案的方式 原始来源也进入了 Ruby可以使用openssl来实现这一点: #!/usr/b

我正在搜索满足以下要求的文件加密/解密算法:

  • 算法必须可靠
  • 对于较大的文件,算法应该是快速的
  • 私钥可以通过某些参数(例如密码)生成
  • 生成的私钥必须与公钥兼容(公钥只生成一次并存储在数据库中)
建议的算法是否有Ruby实现

注意:正如浮雕在评论中提到的,这个答案不适合实际系统。首先,不应使用此方法执行文件加密(例如,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))
并解密:

#!/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))

我担心您在这里混合了两个概念,身份验证/授权和机密性,试图在一个步骤中涵盖这两个方面,但这行不通。永远不要用非对称算法加密“真实数据”。a) 它们的速度太慢了,b)存在一些微妙的问题,如果处理不当,将严重削弱解决方案的安全性

一个很好的经验法则是,使用私有非对称密钥加密的唯一结果应该是由更快的对称算法使用的对称密钥。但在几乎所有的情况下,你甚至不应该这样做,因为在90%的情况下,你真正想要的是TLS(SSL),在这些情况下-我试图解释为什么刚才

在您的情况下,我假设要求如下:

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

  • 一些被选中的人(可能只有一个人)应该能够访问和读取这些数据

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


为此开发一个解决方案不是一件小事,在很大程度上取决于您给定的需求,因此恐怕没有适合每个人的“黄金之路”。我建议做一些研究,更清楚地了解你想要实现什么以及如何实现,然后尝试就你仍然感到不确定/不舒服的主题获得额外的建议

我做了一块宝石来帮你。它被称为密码系统。只需配置私钥的路径和密码以及公钥的路径,其余的工作就完成了

加密非常简单:

rsa = Cryptosystem::RSA.new
rsa.encrypt('secret') # => "JxpuhTpEqRtMLmaSfaq/X6XONkBnMe..."
和解密:

encrypted_value = rsa.encrypt('secret') # => "Y8DWJc2/+7TIxdLEolV99XI2sclHuK..."
rsa.decrypt(encrypted_value) # => "secret"
您可以在或上查看。

速度绝对快,并且对超大文件的流式传输有极好的支持

SymmetricEncryption::Writer.open('my_file.enc') do |file|
  file.write "Hello World\n"
  file.write "Keep this secret"
end
对称加密设计用于加密组织内的数据和大型文件

当涉及到与其他组织共享文件时,最好的选择是PGP。对于使用PGP的超大文件流,请考虑:


查看文件iostreams/lib/io_streams/pgp.rb了解更多pgp示例。它还支持直接从Ruby进行PGP密钥管理。

实际上我不是Ruby专家,但这些都是非常好的电池。我想知道python中的等价物有多难…只是想补充一点,文件应该用AES-256加密,但它的密钥应该用rsa发送。很抱歉,这是一个非常糟糕的建议。OP谈到了文件加密/解密,你不应该使用RSA来实现。@emboss:请参阅tiktak之前的评论。你绝对是对的——在回答这个问题时,我并没有真的停下来考虑更广泛的问题。我会努力修改我的帖子来展示这一点。@brice:太好了!没有伤害,只是不想让人们被误导:)谢谢你的回答!我通过以下方式传输和存储数据解决了这个问题:1)生成对称加密密钥(sym密钥)2)使用sym密钥加密文件3)使用公开的sym密钥加密sym密钥4)发送文件和加密的sym密钥5)使用用户的秘密令牌解密用户的私有加密的sym密钥6)使用私有的sym密钥解密收到的sym密钥7)使用解密的sym密钥解密文件。我认为这很正常。这是正确的方向!但它仍然容易受到重播攻击。您不能使用TLS代替发送由非对称密钥包装的密钥吗?我发现,在几乎所有将数据从A传输到B的情况下,都应该使用TLS而不是非对称加密-TLS保护您免受最有可能破坏自定义协议的因素的影响。
IOStreams.writer('hello.pgp', recipient: 'receiver@example.org') do |writer|
  writer.write('Hello World')
  writer.write('and some more')
end