【发布时间】:2013-11-29 02:43:49
【问题描述】:
Dwolla 允许应用请求并存储用户的 PIN 作为预授权形式,但要求对其进行加密。来自TOS:
PIN 必须在传输和静止时加密(这包括任何和 所有备份介质)使用 FIPS 140-2 标准(至少)
通常,我会使用 Bcrypt 加密(实际上是进行安全哈希。Neil Slater,感谢您的纠正)(使用 bcrypt-ruby gem),例如密码。但是如果我使用 Bcrypt 加密,那么我必须传输哈希值,当然这与 Dwolla 的预期不符,并且 PIN 将被拒绝。
如何加密和解密 PIN 码以确保安全传输?
更新:
Andrew 链接到下面的问题中的一个答案引用了OpenSSL:Cipher,并且使用它我可以使用以下代码加密 PIN。但剩下的问题是:
- 我应该如何存储密钥、iv(初始化向量)和密码?保存为环境变量是否安全,或者将数据库表放入安全哈希中是否更好?
- 下面的代码作为一种加密 PIN 的方式有意义吗?
- 由于我没有来自 Dwolla 的公钥,那么传输它的最佳方式是什么?
pin = "1111" # this is what needs to be encrypted
#encryption:
cipher = OpenSSL::Cipher.new('AES-128-CBC') #=> #<OpenSSL::Cipher:0x00000100ef09d8>
cipher.encrypt
key = cipher.random_key #=> odd characters...
iv = cipher.random_iv #=> odd characters...
encrypted = cipher.update(pin) + cipher.final #=> odd characters...
#dcryption:
decipher = OpenSSL::Cipher::AES.new(128, :CBC)
decipher.decrypt
decipher.key = key
decipher.iv = iv
plain = decipher.update(encrypted) + decipher.final
puts plain == pin #=> true
【问题讨论】:
标签: ruby-on-rails ruby encryption ruby-on-rails-4 dwolla