【问题标题】:How to store the random key and iv created when trying to encrypt in ruby?如何存储尝试在 ruby​​ 中加密时创建的随机密钥和 iv?
【发布时间】:2020-07-12 15:35:39
【问题描述】:

我目前正在从事一个项目,我将在文本文件中存储用户数据。我想使用 Ruby 中的 OpenSSL 库加密这些文件。我能够使用随机创建的密钥和 iv 值加密文件。由于该程序不会在服务器上运行,而是在本地运行,我想使用密码导出这些值,以便其他方法可以解密信息。

require "openssl"

cipher = OpenSSL::Cipher::AES256.new(:CBC)
cipher.encrypt

key = cipher.random_key

iv = cipher.random_iv
encrypted = cipher.update("test.txt") + cipher.final
File.open("temp.txt", "w+") do |file|
    file.write(encrypted)
end

如果我不使用随机密钥,它不会加密信息或返回错误。

'update': key not set (OpenSSL::Cipther::CipherError)

当我尝试使用导出命令(带有随机键)时,我也收到一条错误消息,指出它不是一种方法。

'export' for #<string:0x00000000065659b8> (NoMethodError)

【问题讨论】:

标签: ruby encryption openssl


【解决方案1】:

您似乎没有开发加密方案的经验,所以我建议您不要自己实施。内置的 OpenSSL 库不能保护您免于犯安全错误。正如您所注意到的,它没有提供有关如何安全处理密钥和 iv 的指导(做错将是不安全的)。

我推荐使用rbnacl gem,它有:

RbNaCl::SimpleBox 类提供了一个简单易用的加密 API,其中所有艰难的决定都已提前为您做出。如果您想要加密某些东西,但您对密码学知之甚少,那么这可能就是您想要使用的。

这是一个完整的端到端示例,其中包含输出到磁盘和从磁盘加载:

require 'rbnacl'

generated_key = RbNaCl::Random.random_bytes(RbNaCl::SecretBox.key_bytes)
box = RbNaCl::SimpleBox.from_secret_key(generated_key)

ciphertext = box.encrypt('plaintext')

# save both artifacts to disk
File.open('cipher.bin', 'w') { |f| f.write(ciphertext) }
File.open('key.bin', 'w') { |f| f.write(generated_key) }

# decrypt by reading artifacts from disk
# this could be done in separate program
ciphertext_from_file = File.read('cipher.bin', mode: 'rb') # r -> "read", b -> "binary"
key_from_file = File.read('key.bin', mode: 'rb')
regenerated_box = RbNaCl::SimpleBox.from_secret_key(key_from_file)

regenerated_box.decrypt(ciphertext_from_file)
# => 'plaintext'

# cleanup
File.delete('cipher.bin') if File.exist?('cipher.bin')
File.delete('key.bin') if File.exist?('key.bin')

注意generated_keyciphertext 都是二进制字符串。如果您不想保存原始二进制文件,请使用Base64.encode64Digest.hexencode 之类的方式将它们转换为可打印字符。这样一来,它们就可以打印、复制/粘贴,而且您无需使用 'rb' 进行“读取二进制”。

【讨论】:

  • 我能够使用这个 gem 完成加密,但我遇到了同样的问题。对于这个 gem,它确实会生成一个随机密钥,但我在文档中没有看到如何在任何地方安全地传递它。所有示例都在同一个代码块中,这意味着可以保留键值。我有我的第一个 ruby​​ 文件加密消息,然后想要第二个 ruby​​ 文件来解密它。我试图跨越 OpenSSL 导出方法和 gem。没用。
  • 你能详细说明问题是什么吗?听起来你已经设法加密/解密就好了。您是在问如何处理密钥,以及如何将其传递给解密器?使用锁定的门类比:听起来您已经安装了锁并且能够很好地锁定/解锁门。您是在问如何安全地将门钥匙交给某人?
  • 依此类推,我是一名锁匠。我创造了一把锁并将它放在某人的门上。我想想办法把这把钥匙交给主人。门是锁着的,但房主进不去,因为锁匠在保管钥匙,然后把它毁掉。所以我试图从本质上用密码保护密钥文件,以便所有者可以访问密钥。但是,我在两个单独的函数中执行此操作,这意味着第一个程序关闭并且密钥实际上丢失了。
  • 显然,您无法销毁密钥,您必须将其交付解密。您在简单地“将密钥交给用户”时遇到了什么麻烦?听起来您有一些操作问题(不是加密问题),但尚未解释与该问题相关的任何内容。
  • 基本上,加密后我不知道如何恢复密钥。我有两个文件。我有加密器和解密器,所以我可以学习 gem 的基础知识。运行加密后,我能够创建一个不可读且需要理解密钥的文件。我还没有找到一种方法来使用这个 gem 来导出密钥,密码保护它,然后稍后为解密器文件加载它。在 gem 的文档中,它只显示了同一项目文件中的示例。我无法在单独的文件中执行此操作。我可以在同一个文件中做到这一点。
猜你喜欢
  • 2017-11-20
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
相关资源
最近更新 更多