gpt4 book ai didi

C - 在 Sqlite 数据库中存储 MD5

转载 作者:太空宇宙 更新时间:2023-11-04 03:32:14 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com