C - 在 Sqlite 数据库中存储 MD5

标签 c sqlite

问:如何在 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 typingCREATE 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/

相关文章:

android - 按查询分组在 android 2.1 中不起作用

c++ - g++ 链接器 : force static linking if static library exists?

c - 我的 C do while 循环不会执行

objective-c - 使用底层 SQLite 数据库时 [NSManagedObjectContext save] 是原子提交吗?

sqlite - Websql不创建表

android - 如何将图像从 Drawable 加载到 SimpleCursorAdapter

c - 我该如何修复散列时发生的这个 malloc 错误

c - 在内核空间中存储结构数组,Linux

如果 Linux 内核模块不使用任何物理硬件,它可以使用 UIO 吗?

sql - 选择连续的数据对