我正在加密包含敏感数据的文本字符串。我需要将这些加密的字符串保存到MySQL数据库。字符串是密文,所有字符(可打印的ASCII控制字符到null
的可能性都相同)。
这些字符串不长(<40个字符)。我使用Ruby 2.1(没有Rails)以及带有自定义salt的加密器gem和iv进行加密。 encryptor gem是Ruby的openssl的包装器。
对于很多字符串,这很好用。但是,我遇到了少量这些字符串,一旦加密,就会包含非法或不正确引用的字符。因此,当保存字符串时,我收到错误。
处理加密值的最佳方法是什么,以便可以可靠地保存到MySQL?
这是我的加密命令:
require 'encryptor'
encrypted_value = Encryptor.encrypt(@sensitive_string,
:key => @config["encryption"]["key"],
:iv = @config["encryption"]["iv"],
:salt => @config["encryption"]["salt"])
这是加密值:
encrypted_value: /:Z`߉Nc??"v'??\??؟??????Oa?jR
MySQL更新声明:
query = "UPDATE db.table
SET `key` = mysql_real_escape_string(#{encrypted_value})"
使用查询中的值,它看起来像:
query UPDATE db.table
SET `key` = mysql_real_escape_string(/:Z`߉Nc??"v'??\??؟??????Oa?jR)
我已经尝试了MySQL Quote和mysql_real_escape_string函数。我在两者中都得到了相同的错误,并将encrypted_value包装在双引号和单引号中。
然后我收到此错误:
wrong number of arguments (0 for 2) (ArgumentError)
解决这个问题的最佳方法是什么?任何建议表示赞赏。
答案 0 :(得分:2)
您可以对加密字符串执行base64编码,并将编码值存储在DB中。
检索值时,您可以将其解码回二进制并解密。
require "base64"
enc = Base64.encode64('Send reinforcements')
# -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
plain = Base64.decode64(enc)
# -> "Send reinforcements"
http://ruby-doc.org/stdlib-2.2.0/libdoc/base64/rdoc/Base64.html