Ist*_*van 11 ruby security encryption openssl
我需要编写一个加密/解密文件的简单工具.
我想最好的方法是使用OpenSSL:
生成密钥:
openssl rand -base64 2048 > secret_key
Run Code Online (Sandbox Code Playgroud)
加密文件:
openssl aes-256-cbc -a -e -in file -out file.enc -k secret_key
Run Code Online (Sandbox Code Playgroud)
解密文件:
openssl aes-256-cbc -d -in file.enc -out file -k secret_key
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法在Ruby中实现它?有没有更好的方法呢?使用PGP可能吗?
emb*_*oss 22
Ruby的OpenSSL是OpenSSL本身的一个薄包装器,它提供了OpenSSL本身所具有的几乎所有功能,所以是的,所有示例都有一对一的映射:
openssl rand -base64 2048 > secret_key
Run Code Online (Sandbox Code Playgroud)
这实际上是夸大了,你使用的是AES-256,所以你只需要一个256位密钥,这里你没有使用RSA.Ruby OpenSSL不需要这个决定,它会根据你想要使用的算法自动确定正确的密钥大小.
您在加密过程中也犯了使用确定性IV的错误.为什么?因为您根本没有指定IV,所以OpenSSL本身将默认为所有零字节的IV.这不是一件好事,所以我会告诉你正确的方法,有关更多信息,请查看Cipher文档.
require 'openssl'
# encryption
cipher = OpenSSL::Cipher.new('aes-256-cbc')
cipher.encrypt
key = cipher.random_key
iv = cipher.random_iv
buf = ""
File.open("file.enc", "wb") do |outf|
File.open("file", "rb") do |inf|
while inf.read(4096, buf)
outf << cipher.update(buf)
end
outf << cipher.final
end
end
# decryption
cipher = OpenSSL::Cipher.new('aes-256-cbc')
cipher.decrypt
cipher.key = key
cipher.iv = iv # key and iv are the ones from above
buf = ""
File.open("file.dec", "wb") do |outf|
File.open("file.enc", "rb") do |inf|
while inf.read(4096, buf)
outf << cipher.update(buf)
end
outf << cipher.final
end
end
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,加密和解密非常相似,因此您可以将流式读/写组合成一个共享方法,并将其传递给正确配置的Cipher加上相应的文件名,为了清楚起见,我只是明确地说明了这些.
如果你想对密钥进行Base64编码(也可能是IV),你可以使用Base64模块:
base64_key = Base64.encode64(key)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10331 次 |
| 最近记录: |