Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在PostgreSQL中准备、存储和检索加密数据_C_Mcrypt_Postgresql 9.2_Libpq_Bytea - Fatal编程技术网

C 在PostgreSQL中准备、存储和检索加密数据

C 在PostgreSQL中准备、存储和检索加密数据,c,mcrypt,postgresql-9.2,libpq,bytea,C,Mcrypt,Postgresql 9.2,Libpq,Bytea,有人知道如何正确地准备将BYTEA数据类型插入到postgresql中吗?我有一个从libmcrypt生成的加密字符串。很抱歉,我希望将加密存储在定义为 cdata bytea不为空 我有一个与命令行完美配合的内核,但现在我希望将加密存储在RDBMS中,作为OPPTO文件。代码片段如下所示: int rs; char buffer[1]; char dbuffer[1024]; datafile = "This is my house"; // assume this to be a file

有人知道如何正确地准备将BYTEA数据类型插入到postgresql中吗?我有一个从libmcrypt生成的加密字符串。很抱歉,我希望将加密存储在定义为 cdata bytea不为空

我有一个与命令行完美配合的内核,但现在我希望将加密存储在RDBMS中,作为OPPTO文件。代码片段如下所示:

int rs;
char buffer[1];
char dbuffer[1024];
datafile = "This is my house";  // assume this to be a file
crypt_key[] = "12345678901234567890123456789012";  //  32 bytes
crypt_iv[] =  "11111111111111111111111111111111";  // 32 bytes
mfd = mcrypt_module_open(MCRYPT_RIJNDAEL_256, NULL, "cfb", NULL);  // assume success
mcrypt_generic_init(mfd, crypt_Key, 32,crypt_iv);  // assume success

while(readInputFile(datafile,buffer,sizeof(buffer),&bytes) == cgiFormSuccess) {
        mcrypt_generic(mfd,buffer,sizeof(buffer));  // buffer size s/b 1
        dbuffer[i++] = *buffer;
        dbuffer[i] = '\0';  // Time spent on string sanity
}  // processed each byte is now encrypted

// Now I wish to prepare dbuffer for table insertion
sb = PQescapeByteaConn(dbconn,dbuffer,(size_t)strlen(dbuffer),&rs);

// Perform Insertion --> cdata::BYTEA
sprintf(query,"INSERT INTO crypto (uid,crypt_key,crypt_iv,cdata,cfile)"
                  "VALUES('%s','%s','%s','%s','%s')",
         ebs->uid,ebs->crkey,ebs->crivs,sb,credf);  // cfile == original filename
ebs->r=db_func_query(ebs->r,query,0,proc);  // Please assume DB command success

// Expected output sb == \x...some hex, dbuffer == encrypted bytes.  sb is now in bytea table column.
######################################
// Prepare to decrypt the cdata::bytea column

sprintf(query,"DECLARE %s CURSOR FOR SELECT crypt_iv,cdata,cfile "  // not sure if cursor s/b regular or binary for this
                  "FROM crypto WHERE uid='%s' AND crypt_iv='%s' AND action=true",
         VCURSOR,ebs->uid,ebs->crkey);

db_func_txn_begin(ebs->r,proc);
ebs->r = db_func_query(ebs->r,query,1,proc);  // process the query and assume it delivers the row
if(totalrow) {
     nFields = PQnfields(ebs->r);
     char* results[nFields];
     for(i = 0;i < totalrow;i++) {
          for(j = 0;j < nFields;j++)
               results[j] = PQgetvalue(ebs->r,i,j);
          strcpy(crypt_iv,results[0]);
          strcpy(dbuffer,results[1]);
          strcpy(cfile,results[2]);
}
mcrypt_generic_init(mfd, crypt_Key, 32,crypt_iv);  // assume success
sb = PQunescapeBytea(dataBuf,&rs);

for(i = 0;i < rs+1;i++) {
     mdecrypt_generic(mfd,sb[i],1);  // buffer size s/b 1
     dbuffer[i] = sb[i];
     dbuffer[i+1] = '\0';  // Time spent on string sanity
}

// Expected output sb == reverse of PQescapeByteaConn, dbuffer == unencrypted bytes.
必须有一种方法可以成功地插入和查询加密字符串进行解密


提前谢谢

问题已解决。只要转义mcrypted字符串的输出,就可以不使用文本列。Bytea更干净,但更多的代码行和PGUNESCAPEYTEA显然是解密所必需的。

来自pgsql黑客的交叉帖子:。稍后发现此内容的读者也应该查看该线程,以防稍后在那里发布相关信息。顺便说一句,此代码应该真正使用libpq的参数化查询接口,以确保它不会受到任何可能的SQL注入风险的影响,为了便于调试和转义,您提到的过程db processing procedure只是我的libpq库调用的一个包装器,这样可以减少写入的行数,并且它已经工作了多年,没有任何已知或报告的妥协。然而,我正试图找到一个二进制字符串问题的答案,这个问题涉及到加密输出,我相信是我正在使用的准备技术。这段代码可以很好地处理文件I/O,但不能处理DB插入调用。我正在为PSQL版本9.2.3OK开发这个。。。如果您将写入数据库的加密字节打印到控制台,您能否验证它们在数据库中是否相同?i、 你的代码的读写端有问题吗?克雷格,是的,控制台和数据库内容是相同的。如果我注释掉加密和PGEscapeByteAcon调用,我将验证我实际尝试加密的内容。问题似乎是从茶康开始的。