【发布时间】:2014-08-10 19:16:58
【问题描述】:
我在使用 PostGreSQL 数据库和一些加密数据时遇到了一些问题。我使用河豚算法加密字符串,获得二进制数据作为回报。这个二进制文件可以包含 \0 和一些其他的 scape 序列。
我是这样存储数据的:
`pqxx::binarystring destinatary(encryptedData);`
然后我是这样读的:
pqxx::binarystring bsmsg(r[0]["message"]);
encryptedData =bsmsg.get();
问题是,有时,数据可以完美返回,但在其他情况下,数据会正确返回,之后会出现一些垃圾。关于我应该修改写入/读取的方向以避免这种奇怪的数据被添加到我的加密字符串中的任何线索?
我做的另一个尝试是以这种方式存储数据:
pqxx::binarystring msg(testMsg,testMsgsize);
结果相同。
编辑:根据要求,做了一些日志研究: 我正在研究这个价值观:
std::string encryptedData;
bf.Encrypt(&encryptedData, ""); // THIS IS $4
const void * testMsg = encryptedData.c_str();
size_t testMsgsize = encryptedData.size();
pqxx::binarystring msg(testMsg,testMsgsize);
bf.Encrypt(&encryptedData, "yo"); //$5
pqxx::binarystring destinatary(encryptedData);
bf.Encrypt(&encryptedData, "yomaaaaaaaaaaaaaaaaslargo");//$6
pqxx::binarystring owner(encryptedData);
bf.Encrypt(&encryptedData, "123A@u");//$7
pqxx::binarystring key(encryptedData);
并将 em 等放入
execute addUnconfirmedInvitation: INSERT INTO friendnotices (ownerserver, type, daterecieved, message, destinatary, owner, internaldata, state, internaldataaux) VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9)
2014-08-11 17:12:32 CEST DETAIL: parameters: $1 = 'invite.server()', $2 = 'invitation', $3 = '2014-08-11', $4 = '_(\351\204\376L\036Z', $5 = 'yo\002\002', $6 = 'p\010\224\254m\243\370\177R\222\314\022e/\005*;~\254\2075\205\363\375o\001', $7 = '\375\271\305v\272\036_\377\006\006\006\006', $8 = 'f', $9 = '\372f'' :w\037\312\005\005'
奇怪的是......我通过再次创建相同的变量使用 $5 和 $6 进行搜索得到了正确的行
2014-08-11 17:22:35 CEST LOG: execute searchUnconfirmedInvitation: SELECT * FROM friendnotices WHERE (destinatary=$1) AND (owner = $2) AND (type = $3) AND (ownerserver = $4)
2014-08-11 17:22:35 CEST DETAIL: parameters: $1 = 'yo\002\002', $2 = 'p\010\224\254m\243\370\177R\222\314\022e/\005*;~\254\2075\205\363\375o\001', $3 = 'invitation', $4 = 'invite.server()'
但如果我尝试打印之前显示的字符串:
pqxx::binarystring bsmsg(r[0]["message"]);
encryptedData =bsmsg.get();
bf.Decrypt(&clearData, encryptedData);
pqxx::binarystring bskey(r[0]["internaldata"]);
encryptedData =bskey.get();
bf.Decrypt(&clearData, encryptedData);
pqxx::binarystring des(r[0]["destinatary"]);
encryptedData =des.get();
bf.Decrypt(&clearData, encryptedData);
pqxx::binarystring own(r[0]["owner"]);
encryptedData =own.get();
bf.Decrypt(&clearData, encryptedData);
这是我得到的(3 次尝试):
"���" //this shouls be ""
"123A@u" //this is right
"yo" //this is right
"yomaaaaaaaaaaaaaaaaslargoy" //i used this as search criteria.. but the last y isnt correct!
"���" //second try
"123A@u"
"yo"
"yomaaaaaaaaaaaaaaaaslargo1" //wow... now is a 1
"���" //third try
"123A@u"
"yo"
"yomaaaaaaaaaaaaaaaaslargo" //this time this is correct :?
随着更多的尝试,一切都会继续改变。我最终可以将正确的“”放入第一个属性中。在第一次尝试时正确显示的属性将始终正确显示。
【问题讨论】:
-
如果您可以让库执行底层 SQL 将会很有帮助 - 启用
log_statement = 'all'通常在这里很有用。 (虽然我不会说libpqxx,所以不确定我能帮上多少忙)。 -
感谢您的回复。只是花了一些时间配置 postgresql 服务器并尝试了一些东西。日志没有显示对我明显有用的东西。用你所说的日志和一些测试用例的更多信息编辑了帖子。
标签: postgresql libpqxx bytea