在具有特定UTF-16字符大小的机器上,将字节数组读取为UTF-16字符



我有一个关于utf16_t字符交互和使用OpenSSL生成SHA-256的问题。

问题是,我目前正在编写应该处理密码哈希的代码。我已经生成了一个256位的散列,我想将它放入数据库中的UTF-16编码字符字段中。在我的C++代码中,我使用char16_t来存储这样的数据。然而,存在一个问题。utf16_t可能有超过16个字节,这取决于它最终所在的机器。如果我使用memcpy()从SHA-256哈希中复制字节,在某些机器上可能会一团糟。

在这种情况下我该怎么办?以不同方式读取字节,以不同方式在数据库中存储哈希,也许还有其他什么?

SHA256生成256个基本上随机的数据位(32字节(。它不会总是生成有效的UTF-16数据。

您需要以某种方式将32个字节编码为超过32个utf-16字节以存储在数据库中。或者,您可以将数据库字段转换为正确的256位二进制类型

将其作为字符串存储在数据库中的一种更容易实现的方法是将每个字节映射为1对1的字符(并存储32个字节的数据,其间有32个字节为零(:

unsigned char sha256_hash[256/8];
get_hash(sha256_hash);
// encoding
char16_t db_data[256/8];
for (int i = 0; i < std::size(db_data); ++i) {
db_data[i] = char16_t(sha256_hash[i]);
}
write_to_db(db_data);

char16_t db_data[256/8];
read_from_db(db_data);
// decoding
unsigned char sha256_hash[256/8];
for (int i = 0; i < std::size(sha256_hash); ++i) {
assert((std::uint16_t) db_data[i] <= 0xFF);
sha256_hash[i] = (unsigned char) db_data[i];
}

但是,如果使用以null结尾的字符串,请小心。您将需要一个额外的字符作为null终止符,并将0字节映射到其他字符(0x100将是一个不错的选择(。

但是,如果您有额外的要求(比如它是可读字符(,您可能会考虑base64或十六进制编码

最新更新