问:如何从C中的Sqlite数据库绑定和检索MD5哈希?
我(有点)意识到加密vulnerabilities of MD5因此无意将其用于检查文件完整性的简单方法之外的其他任何内容。
我在this question中观察到,在典型的MySQL数据库中,哈希可以存储为Binary(16)
或Char(32)
类型。我应该选择使用Binary(16)
我需要确保将其存储为二进制数据,而不是以十六进制编码,否则我可能会丢失一半的MD5。
在this question中,我观察到虽然Sqlite中没有Binary(16)
或Char(32)
类型;事实上似乎是一个等价于Binary(16)
的Sqlite,但这可能是通过使用二进制blob (b blob)
?
我不确定的是我将如何通过Sqlite3 C API实现这一目标。我可以使用sqlite3_bind_binaryblob
函数将此数据类型发送到我的数据库。同样地,没有明显sqlite3_column_binaryblob
我可以检索这些数据(我在这里故意简化以说明我正在寻找的东西)。我有一种感觉我应该将哈希存储为blob
,我是对的吗?
但是如果我可以使用(b blob)
,那么添加复杂性就是我不知道如何将我的数据从十六进制转换为二进制并再次返回aformentioned中的建议(虽然是python而不是c)相关问题。如果有一个更简单的方法来实现(例如只使用blob)如何以及(可能)为什么我应该这样做将是一个受欢迎的建议!
答案 0 :(得分:1)
使用字符串(这浪费空间)或更好地使用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]);
}
用于绑定blob的函数称为sqlite3_bind_blob()
,用于绑定字符串use sqlite3_bind_text()
。