问:如何在 C 中从 Sqlite 数据库绑定(bind)和检索 MD5 哈希值?
我(有点)知道密码 vulnerabilities of MD5,所以除了检查文件完整性的简单方法外,无意将其用于任何其他用途。
我在 this question 中观察到,在典型的 MySQL 数据库中,哈希可以存储为 Binary(16)
或 Char(32)
类型。如果我选择使用 Binary(16)
,我需要确保将其存储为二进制数据,而不是用十六进制编码,否则我有丢失一半 MD5 的风险。
在 this question 中,我观察到虽然 Sqlite 中没有 Binary(16)
或 Char(32)
类型;实际上似乎有一个 Sqlite 等同于 Binary(16)
但这可能是通过使用二进制 blob (b blob)
?
我不确定的是如何使用 Sqlite3 C API 实现这一点。似乎没有一个 sqlite3_bind_binaryblob
函数可用于将此数据类型发送到我的数据库。同样,没有明显的 sqlite3_column_binaryblob
我可以检索这些数据(我在这里有意简化以说明我在寻找什么)。我觉得我应该将散列存储为 blob
,对吗?
但是如果有一个我可以使用的 (b blob)
,复杂的是我不知道如何按照 aformentioned (尽管是 python 而不是 c) 相关问题。如果有更简单的方法来实现(例如仅使用 blob)我应该如何以及(可能)为什么这样做将是一个受欢迎的建议!
最佳答案
要么使用字符串(这会浪费空间),要么更好地使用 blob。 Sqlite3 使用 manifest typing ,CREATE TABLE
语句中指定的类型只是一个建议。
将 MD5 和从十六进制转换为二进制非常简单,您可以使用以下代码片段(为简洁起见省略了错误检查):
static int hexchar(char c)
{
const char *lookup = "0123456789abcdef";
return (int)(strchr(lookup, tolower(c)) - lookup);
}
#define MD5LEN 128
extern void
md5tobin(unsigned char out[restrict MD5LEN/8], const char in[restrict MD5LEN/4])
{
size_t i;
for (i = 0; i < MD5LEN/8; i++)
out[i] = hexchar(in[2*i]) << 4 | hexchar(in[2*i+1]);
}
用于绑定(bind) blob 的函数称为 sqlite3_bind_blob()
,绑定(bind)字符串使用 sqlite3_bind_text()
。
关于C - 在 Sqlite 数据库中存储 MD5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35418767/