Ruby:使用私钥/公钥进行文件加密/解密
我正在寻找一种文件加密/解密算法,它满足以下要求:
- 算法必须可靠
- 对于相当大的文件,算法应该很快
- 私钥可以通过某些参数生成(例如,密码)
- 生成的私钥必须与公钥兼容(公钥只生成一次并存储在数据库中)
是否有建议算法的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))
从这里
我担心你在这里混合了两个概念,即身份validation/授权和机密性,试图在一个步骤中涵盖这两个方面,这是行不通的。 您永远不应该使用非对称算法加密“真实数据”。 a)它们太慢了,b)有一些微妙的问题,如果做得不好,将严重削弱你的解决方案的安全性。
一个好的经验法则是,您应该最终使用私有非 对称密钥进行加密,这是由更快的对称算法使用的对称密钥。 但在几乎所有情况下你都不应该这样做,因为在90%的情况下,你真正想要的是那些情况下的TLS(SSL) – 我试着解释为什么在这里 。
在您的情况下,我认为要求是:
-
要存储在数据库中的数据的机密性:一般公众不应该能够读取它(甚至访问它)
-
选定的少数人(可能只是一个人)应该能够访问和读取该数据
通常通过使用对称加密来实现第一个目标。 第二个目标虽然是相关的,但却以完全不同的方式实现。 您希望访问该文件的用户进行身份validation(即建立身份),最重要的是您还希望他们获得授权(即检查已建立的身份是否有权按照他们的意图执行)。 这是非对称加密可能进入阶段的地方,但不一定如此。 由于你的问题用Rails标记,我假设我们正在讨论Rails应用程序。 您通常已经有一些方法来对那里的用户进行身份validation和授权(很可能涉及上述TLS),您可以简单地重用它们以便为实际文件加密/解密建立对称密钥。 如果您想要避免非对称加密, 基于密码的加密将适合此目的。 如果您还想确保已经保密的数据的完整性,事情变得更加复杂,也就是说,您希望为经过身份validation的授权用户提供一种保证,即他们最终访问的内容未以任何方式进行更改同时。
为此制定解决方案将不是一件轻而易举的事,并且在很大程度上取决于您的要求,所以我担心没有适合每个人的“黄金方式”。 我建议做一些研究,更清楚地了解你想要达到的目标和方法,然后尝试获得有关你仍感到不确定/不舒服的主题的额外建议。
我做了一个gem来帮助解决这个问题。 它被称为cryptosystem
。 只需配置私钥的路径和密码以及公钥的路径,剩下的工作就完成了。
加密非常简单:
rsa = Cryptosystem::RSA.new rsa.encrypt('secret') # => "JxpuhTpEqRtMLmaSfaq/X6XONkBnMe..."
并解密:
encrypted_value = rsa.encrypt('secret') # => "Y8DWJc2/+7TIxdLEolV99XI2sclHuK..." rsa.decrypt(encrypted_value) # => "secret"
你可以在GitHub或RubyGems上查看它。
对称加密绝对是快速的,并且非常支持非常大的文件流。
SymmetricEncryption::Writer.open('my_file.enc') do |file| file.write "Hello World\n" file.write "Keep this secret" end
对称加密旨在加密组织内的数据和大型文件。
在与其他组织共享文件时,最好的选择是PGP。 对于使用PGP传输非常大的文件,请考虑: IOStreams
IOStreams.writer('hello.pgp', recipient: 'receiver@example.org') do |writer| writer.write('Hello World') writer.write('and some more') end
查看文件iostreams / lib / io_streams / pgp.rb以获取更多PGP示例。 它还直接从Ruby支持PGP密钥管理。