如果密码有非法字符,如何将密文保存到db?

时间:2015-10-07 17:29:16

标签: mysql ruby encryption

我正在加密包含敏感数据的文本字符串。我需要将这些加密的字符串保存到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

和截图,因为某些字符未正确复制: enter image description here

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)

解决这个问题的最佳方法是什么?任何建议表示赞赏。

1 个答案:

答案 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