Mysql 如果密文包含非法字符,如何将其保存到db?

Mysql 如果密文包含非法字符,如何将其保存到db?,mysql,ruby,encryption,Mysql,Ruby,Encryption,我正在对包含敏感数据的文本字符串进行加密。我需要将这些加密字符串保存到MySQL数据库。字符串是密文,所有字符(控制字符为null的可打印ASCII码的可能性相同) 这些字符串不长(

我正在对包含敏感数据的文本字符串进行加密。我需要将这些加密字符串保存到MySQL数据库。字符串是密文,所有字符(控制字符为
null
的可打印ASCII码的可能性相同)

这些字符串不长(<40个字符)。我正在使用Ruby 2.1(无Rails)以及带有自定义salt和iv的encryptor gem来进行加密。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\u real\u escape\u字符串函数。这两种方法都会出现相同的错误,并且将加密的_值用双引号和单引号括起来

然后我得到这个错误:

wrong number of arguments (0 for 2) (ArgumentError)

解决这个问题的最佳方法是什么?任何建议都将不胜感激

您可以对加密字符串执行base64编码,并将编码值存储在DB中

检索值时,可以将其解码回二进制并解密

require "base64"

enc   = Base64.encode64('Send reinforcements')
                    # -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
plain = Base64.decode64(enc)
                    # -> "Send reinforcements"

作为旁注:每种加密的IV/salt点不同。因此,从配置中读取它们并没有抓住要点。您通常会做以下两件事之一:(1)使用a存储原始密码文本;或者(2)使用十六进制、Base32、Base64等将原始密码文本编码为可打印的ASCII。然后将其作为字符串或
char*
存储。二进制BLOB可能是最有效的。它最紧凑,并且不需要额外的编码。