如何XOR md5哈希值并在postgresql中将它们转换为HEX

时间:2013-07-19 06:59:12

标签: postgresql cryptography md5 xor md5sum

到目前为止我尝试了什么

     SELECT md5(text) will return text (hex strings) .

之后我们需要xor他们

    SELECT x'hex_string'  # x'hex_string';

但是上面的结果是二进制值。 如何将它们再次转换为十六进制字符串?

在postgresql中是否存在xor md5值并再次将其转换为十六进制值?

2 个答案:

答案 0 :(得分:1)

那些二进制值实际上是bit varying类型,与bytea显着不同。

bit varying内置了对XOR等的支持,但PostgreSQL不提供从bit varyingbytea的强制转换。

你可以编写一个执行强制转换的函数,但这不是一件容易的事情,可能不是你案例中更有效的方法。

直接对md5摘要进行XOR更有意义。 PostgreSQL也没有为bytea提供XOR运算符,但它可以很容易地写入函数中,特别是假设操作数具有相等的长度(在md5摘要的情况下为16字节):

CREATE FUNCTION xor_digests(_in1 bytea, _in2 bytea) RETURNS bytea
AS $$
DECLARE
 o int; -- offset
BEGIN
  FOR o IN 0..octet_length(_in1)-1 LOOP
    _in1 := set_byte(_in1, o, get_byte(_in1, o) # get_byte(_in2, o));
  END LOOP;
 RETURN _in1;
END;
$$ language plpgsql;

现在,生成十六进制字符串的内置postgresql md5函数也不适合进行后处理。 pgcrypto模块提供此功能:

 digest(data text, type text) returns bytea

使用此功能并将最终结果作为十六进制字符串:

   select encode(
          xor_digest ( digest('first string', 'md5') ,
                       digest('second string', 'md5')),
          'hex');

生成结果:c1bd61a3c411bc0127c6d7ab1238c4bd,类型为text

如果无法安装pgcrypto并且只有内置的md5功能可用,您仍然可以合并encodedecode来实现这样的结果:

select
encode(
 xor_digest(
   decode(md5('first string'), 'hex'),
   decode(md5('second string'), 'hex')
 ),
 'hex'
);

结果:

  

c1bd61a3c411bc0127c6d7ab1238c4bd

答案 1 :(得分:0)

您可能需要检查

https://github.com/artejera/text_xor_agg/

我最近为这样的用例编写了这个 postgres 脚本。