这是我第一次在 MariaDB 中使用加密,所以我需要确保我做对了。我需要简单地以加密方式存储一些标识符,并且想知道我是否正确地执行了它。由于我在数据检索时遇到了一些意外行为(有时只是),我怀疑有什么问题(而且我一直在检查文档等,这一切似乎都是正确的..?)。
- 我将数据存储在
BLOB
和NOT NULL
列中,没有指定其他内容。 - 我正在使用它插入数据,而
key
通过openssl rand -base64 32
INSERT INTO data_table ( encr_data ) VALUES( AES_ENCRYPT( "secret_string", "key" ) );
- 我正在使用以下方法检索数据:
SELECT CAST( AES_DECRYPT( encr_data, "key" ) AS CHAR ) as encr_data FROM data_table;
这是在 MariaDB 中正确的做法吗?秘密字符串由大约 35 - 40 个字符组成。
这对我来说真的很重要,因为我正在编写的应用程序正在存储一些秘密数据以与另一个 API 一起使用。换言之,加密本身不应带来任何有关数据完整性的风险。只是想到由于任何加密错误(使加密+存储的数据无法使用)而需要重新生成所有加密数据......
所以我需要确保加密字符串中没有数据被裁剪,并且加密正确完成,因此是这个问题的原因。
AES_ENCRYPT
返回二进制数据(BLOB
或BINARY(...)
)CASTing
一个 BLOB 到一个 CHAR 搞得一团糟。不要那样做。您可以通过 将其转换为十六进制
HEX(AES_ENCRYPT(...))
。 这可以放入 aVARCHAR
或TEXT
。如果那是 40 个表情符号,那将占用大量字节。我建议以下列方式之一声明该列:
如果用于密码验证,AES 是错误的方法。相反,请使用单向哈希(MD5、SHA% 等)。
NULL vs NOT NULL——这取决于业务逻辑。如果您需要“尚未设置”(等),那么
NULL
是合理的。