我有一个MySQL数据库,配置为接收带有波兰字符的数据(f。ex±,ę,ó,ł,ñ等)。
现在我想使用AES_ENCRYPT()
将带有这些波兰语字符的数据发送到数据库,然后使用AES_DECRYPT()
从那里获取它们。
我的问题是我在C#中收到一个byte []数组,其中包含X个元素,其中X是我收到的文本长度。每个数组元素都有一个代表它的字符的ASCII码。我可以使用Encoding Class轻松将其转换为文本,但我不会在输出文本中获得波兰语字符。
F。例如:
我将AES_ENCRYPT('ąąą', '123')
发送给db。
我得到AES_DECRYPT('sql command','123')
,我得到byte[]
,其中有3个元素,每个人都有'97'值代表'aaa'
- 不是'ąąą'
。
如何以允许我向我的数据库发送/获取字符的方式使用AES_DECRYPT/ENCRYPT
?
或者如何从aes_decrypt()获取字符串输出而不是byte []?
答案 0 :(得分:2)
使用编码转换可能对您有帮助。
select convert(aes_decrypt(aes_encrypt('ąąą', 'abcdefg'), 'abcdefg') using UTF8);
答案 1 :(得分:1)
为什么不在代码中而不是在查询中实现加密/解密?
private static Byte[] Encrypt(String toEncrypt, Byte[] Key, Byte[] IV)
{
CryptoStream streamCrypto = null;
MemoryStream streamMemory = null;
RijndaelManaged aes = null;
StreamWriter streamWriter = null;
try
{
aes = new RijndaelManaged();
aes.Key = Key;
aes.IV = IV;
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
streamMemory = new MemoryStream();
streamCrypto = new CryptoStream(streamMemory, encryptor, CryptoStreamMode.Write);
streamWriter = new StreamWriter(streamCrypto);
streamWriter.Write(toEncrypt);
}
finally
{
if (streamWriter != null)
streamWriter.Close();
if (streamCrypto != null)
streamCrypto.Close();
if (streamMemory != null)
streamMemory.Close();
if (aes != null)
aes.Clear();
}
return streamMemory.ToArray();
}
public static String Decrypt(Byte[] toDecrypt, Byte[] Key, Byte[] IV)
{
CryptoStream streamCrypto = null;
MemoryStream streamMemory = null;
RijndaelManaged aes = null;
StreamReader streamReader = null;
String output = null;
try
{
aes = new RijndaelManaged();
aes.Key = Key;
aes.IV = IV;
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
streamMemory = new MemoryStream(toDecrypt);
streamCrypto = new CryptoStream(streamMemory, decryptor, CryptoStreamMode.Read);
streamReader = new StreamReader(streamCrypto);
output = streamReader.ReadToEnd();
}
finally
{
if (streamReader != null)
streamReader.Close();
if (streamCrypto != null)
streamCrypto.Close();
if (streamMemory != null)
streamMemory.Close();
if (aes != null)
aes.Clear();
}
return output;
}
在您的代码中,您加密字符串,然后将加密数据发送到数据库:
Byte[] encrypted = Encrypt(yourString, Key, IV);
当您从数据库中提取数据时,您只需使用以下命令取回字符串:
String decrypted = Decrypt(dbData, Key, IV);
如果你不喜欢这样,只需使用你的查询:
INSERT INTO mysecrets (mysecret1, mysecret2) VALUES (AES_ENCRYPT(secret1, YOUR_ENCRYPTION_KEY), AES_ENCRYPT(secret2, YOUR_ENCRYPTION_KEY))
SELECT AES_DECRYPT(mysecret1, YOUR_ENCRYPTION_KEY) AS secret1, AES_DECRYPT(mysecret1, YOUR_ENCRYPTION_KEY) AS secret2 FROM mysecrets
答案 2 :(得分:1)
您的MySQL数据是字符,而加密适用于字节。您需要在加密字符之前将字符转换为字节,并将解密的字节转换回字符。这意味着您需要明确指定要在两端使用的字符编码,以便它们匹配。当前标准是UTF-8,因此您应该在每一端指定。如果UTF-8不起作用,那么在两端尝试一些Microsoft特定的字符编码。