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
- 算法必须可靠
- 对于较大的文件,算法应该是快速的
- 私钥可以通过某些参数(例如密码)生成
- 生成的私钥必须与公钥兼容(公钥只生成一次并存储在数据库中)
#!/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),在这些情况下-我试图解释为什么刚才 在您的情况下,我假设要求如下:
- 要存储在数据库中的数据的机密性:一般公众不应该能够读取(甚至访问)
- 一些被选中的人(可能只有一个人)应该能够访问和读取这些数据
为此开发一个解决方案不是一件小事,在很大程度上取决于您给定的需求,因此恐怕没有适合每个人的“黄金之路”。我建议做一些研究,更清楚地了解你想要实现什么以及如何实现,然后尝试就你仍然感到不确定/不舒服的主题获得额外的建议 我做了一块宝石来帮你。它被称为密码系统。只需配置私钥的路径和密码以及公钥的路径,其余的工作就完成了 加密非常简单:
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