繁体   English   中英

C-在Sqlite数据库中存储MD5

[英]C - Storing MD5 in a Sqlite Database

问:如何从C中的Sqlite数据库绑定和检索MD5哈希?

我(某种程度上)知道MD5的加密漏洞,因此除了用于检查文件完整性的简单方法外,无意将其用于其他任何用途。

我在这个问题中观察到,在典型的MySQL数据库中,哈希可以存储为Binary(16)Char(32)类型。 如果我选择使用Binary(16) ,则需要确保将其存储为二进制数据,并且不以十六进制编码,否则可能会丢失一半的MD5。

这个问题中,我观察到,虽然Sqlite中没有Binary(16)Char(32)类型; 实际上似乎有一个与Binary(16)等效的Sqlite,但这可能是通过使用二进制blob (b blob)

我不确定如何使用Sqlite3 C API实现此目标 似乎没有sqlite3_bind_binaryblob函数可供我用来将此数据类型发送到数据库。 同样,没有明显的sqlite3_column_binaryblob可以检索此数据(在这里我故意简化以说明我在寻找什么)。 我有一种感觉,我应该将散列存储为blob ,对吗?

但是,如果有一个(b blob)我可以使用,那么额外的麻烦就是我不知道如何将我的数据从十六进制转换为二进制然后又转换回上述 (尽管是python而不是c)相关问题。 如果有一种更简单的方法来实现(例如仅使用Blob),那么如何以及(可能)为什么要这样做将是一个受欢迎的建议!

请使用字符串(这样会浪费空间),或者最好使用blob。 Sqlite3使用清单类型 ,在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() ,用于使用sqlite3_bind_text()绑定字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM