最近在折腾PostgREST的时候把用户密码用SHA512 hash之后在base64编码会迷之产生一个加号和换行。发现只要是对比较长的数据进行base64编码就会出现加号并换行,虽然知道某个RFC说Base64好像最多一行只能写78字符,但是明显换行的时候多了个加号,不过把结果重新decode之后的结果是没问题的。而且把有问题的结果丢node.js里面是解不出原来的数据的。。
例如:
frontier=> select encode('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890+/', 'base64');
encode
------------------------------------------------------------------------------
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0+
NTY3ODkwKy8=
(1 row)
frontier=> select decode(encode('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890+/', 'base64'), 'base64');
decode
--------------------------------------------------------------------------------------------------------------------------------------
\x4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a30313233343536373839302b2f
(1 row)
pgsql不太熟悉,不知道怎么把bytea转回去,不过勉强能看出来跟原文是一致的。但是base64的结果跟node.js输出相比就会多出一个加号,而且加号后面换行了
-- pgSQL输出:
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0+
NTY3ODkwKy8=
-- Node.js输出:
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkwKy8=
Node.js解码结果:
加号是换行的提示(可以用psql的-A参数关闭),不是字符串内容的一部分,导致了误解。下面返回结果是空的:
可以用
convert_from
函数把bytea转成字符串:`