You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C# Npgsql查询向bytea列发送加密字节数组数据

解决Npgsql插入字节数组时存为System.Byte[]的问题

你遇到的问题根源是:直接将byte[]对象嵌入字符串SQL时,C#会自动调用它的ToString()方法,而byte[]的默认ToString()返回的就是System.Byte[]字符串,所以数据库里存的是这个文本,不是实际的字节数据。而且这种字符串拼接SQL的方式还存在严重的SQL注入风险,绝对不能用。

正确的做法是使用参数化查询,让Npgsql自动处理字节数组和PostgreSQLbytea列的类型映射,同时避免注入风险。

正确代码示例

private readonly SHA256 sha256 = SHA256.Create();

// 假设你已经有NpgsqlConnection实例conn
using var cmd = new NpgsqlCommand("INSERT INTO table(encrypted_column) VALUES (@hash)", conn);
// 添加参数,指定参数类型为Bytea(可选,Npgsql通常能自动推断)
cmd.Parameters.Add("@hash", NpgsqlDbType.Bytea).Value = sha256.ComputeHash(data);
// 执行命令
cmd.ExecuteNonQuery();

为什么参数化查询能解决问题

  • Npgsql会直接把byte[]的原始字节数据发送给PostgreSQL,不会转换成字符串,所以bytea列会存储正确的哈希字节。
  • 彻底避免SQL注入攻击,这是操作数据库的最佳实践。

如果你非要用字符串拼接(强烈不推荐),需要把字节数组转换成PostgreSQL能识别的bytea格式字符串,比如转成十六进制并加\x前缀:

byte[] hashBytes = sha256.ComputeHash(data);
string hexHash = "\\x" + BitConverter.ToString(hashBytes).Replace("-", "");
string sql = $"INSERT INTO table(encrypted_column) VALUES ({hexHash})";

但这种方式不仅麻烦,还存在SQL注入风险,只在极端场景下临时用,优先用参数化查询。

内容的提问来源于stack exchange,提问作者Dorialean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:30:42