Ruby怎么使用私钥/公钥进行文件加密/解密?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (75)

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

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

有推荐算法的Ruby实现吗?

提问于
用户回答回答于

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))

用户回答回答于

恐怕你在这里混淆了两个概念,身份验证/授权和机密性,试图在一个步骤中涵盖这两个方面,但这是行不通的。你永远不应该用不对称算法加密“真实数据”。它们太慢了还有些微妙的问题,如果做不好,会严重削弱解决方案的安全性。

一条好的经验法则是,你唯一应该用私密加密的东西。不对称钥匙是对称一个更快的对称算法使用的密钥。但是在几乎所有的情况下,你都不应该这么做,因为在90%的案例中,你真正想要的是tls(Ssl)--我试着解释了为什么。

我假设要求是:

  • 存储在数据库中的数据的机密性:一般公众不应该能够读取(甚至无法访问)
  • 选定的少数人(可能只有一个人)应该能够访问和读取这些数据。

第一个目标通常是通过使用对称加密...。第二个目标是,尽管是相关的,但实现的方式完全不同。你希望对访问文件的用户进行身份验证(即建立身份),并且在此基础上还希望他们获得授权(即检查已建立的身份是否有权做他们想做的事情)。这就是非对称密码学的地方五月进入舞台,但不一定。由于你的问题是用Rails标记的,所以我想我们讨论的是Rails应用程序。你通常已经有了一些方法来对用户进行身份验证和授权(很可能涉及上述TLS),你可以简单地重用它们,以便为实际的文件加密/解密建立对称密钥。密码加密如果你想避免不对称密码的话。如果你还想确保已经保密的数据的完整性,也就是说,你希望向经过身份验证和授权的用户提供某种保证,即他们最终访问的内容在同一时间内没有任何改变,那么事情就变得更加复杂了。

扫码关注云+社区