【问题标题】:Not able to use openssl in Ruby on Rails application无法在 Ruby on Rails 应用程序中使用 openssl
【发布时间】:2019-07-24 05:25:14
【问题描述】:

我正在尝试在 Ruby on Rails 中使用非对称加密。为此,我正在尝试使用 openssl 库。首先,我在一个名为 Manufacturer 的模型中创建了密钥。

def create_verification_keys
  keypair = DigitalSign.generate_keypair
  self.private_key = keypair.to_s
  self.public_key = keypair.public_key.to_s
end

在此之后,在控制器内部,我写道:

@privatekey=Manufacturer.first.private_key 
@publickey=Manufacturer.first.public_key
$hash=Digest::MD5.hexdigest("abcd")
$encrypted_string = Base64.encode64(@privatekey.private_encrypt($hash))

但是当我运行它时,它返回以下错误:

"undefined method `private_encrypt' for #<String:0x00007f3e107c2360> Did you mean? private_methods"

【问题讨论】:

    标签: ruby-on-rails ruby encryption openssl encryption-asymmetric


    【解决方案1】:

    出现错误,因为@privatekey实例变量的类型是String,并且没有private_encrypt方法。

    它是字符串,因为在 create_verification_keys 方法中,您执行以下操作:

    self.private_key = keypair.to_s
    self.public_key = keypair.public_key.to_s
    

    to_s这里将对象显式转换为字符串,是可以的,因为数据库期望、存储和返回一个简单的字符串(在这种情况下),而不是一个复杂的对象。

    要解决这个问题,您首先需要实例化正确的类型。如果您使用 openssl gem,可能应该是这样的:

    rsa = OpenSSL::PKey::RSA.new(@privatekey)
    rsa.private_encrypt($hash)
    

    文档参考here

    【讨论】:

    • @Maksim..感谢您回答我的问题。我明白你想说什么,我不应该使用字符串来存储密钥文件,因为它对加密没有帮助。那我该怎么办?我需要将密钥存储在数据库中以备后用,我不能将它们存储在文件中,因为我会生成很多密钥对。
    • @AbhishekJaiswal 您可以将这些密钥存储在数据库中并使用它们进行加密。这不是一种安全的方式,但通常可以实现。查看the examples 的构建OpenSSL::PKey::RSA 对象。他们在那里使用File.read,它还返回一个字符串。所以你需要让它工作 - 只需先构造OpenSSL::PKey::RSA,然后在上面调用private_encrypt。您甚至可以在 Manufacturer 模型上声明一个方法,该方法将返回准备好的对象。
    • @AbhishekJaiswal 但是,我建议您也研究将此类敏感数据存储为私钥的其他方法,因为在当前实现的数据库中,它们将存储为纯文本。因此,如果某些黑客获得了对数据库的访问权限,他们将很容易读取它们。 Here are 一些链接,您可以在其中找到相关主题的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2019-01-12
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2017-12-09
    相关资源
    最近更新 更多