在我的node.js应用程序中,我应该可以创建一些新用户。 为了以安全的方式存储密码,我使用钠原生库来生成argon2哈希(https://github.com/sodium-friends/sodium-native)。现在我尝试在postgres数据库中存储这些哈希的字符串表示。
JavaScript查询字符串如下所示:
INSERT INTO users (email, name, password) VALUES ('${email}', '${name}', '${pwHash}')
生成的sql语句如下所示:
INSERT INTO users (email, name, password)
VALUES ('test@test.org', 'test', '$argon2id$v=19$m=8,t=1,p=1$WAw+HmO/+RZTazVr3eOnPg$HYzaB0+Cre23XGR+A1cZawrUvkon2Cx3x7ua5I68xGo ')
除了哈希之外,还存储了一些有关它的更多信息以帮助验证密码。 我不知道它为什么产生所有这些空格,但我认为这是由于所用缓冲区的长度固定。
我的问题是postgres由于某种原因向我发送了一个错误:invalid message format, code: '08P01'
现在,该代码意味着protocol violation
,无论这意味着什么。
有趣的是:当我只是对我在浏览器或控制台中显示的哈希进行硬编码时,它的工作原理是:
INSERT INTO users (email, name, password)
VALUES ('${email}', '${name}', '$argon2id$v=19$m=8,t=1,p=1$WAw+HmO/+RZTazVr3eOnPg$HYzaB0+Cre23XGR+A1cZawrUvkon2Cx3x7ua5I68xGo ')
如果我删除了空格,它似乎没有什么区别。
有谁能告诉我我做错了什么?
编辑:我被问到这些“空白”是否真的是白色空格。至少我是这么认为的,因为它们在编辑器和浏览器中显示为一个,也可以复制为一个。我试图手动删除它们并没有任何区别。 我也尝试使用字符串连接而不是插值,但它也没有任何区别。
答案 0 :(得分:0)
我不是先将缓冲区转换为字符串,而是将哈希存储为原始二进制数据(数据类型bytea),因为它是由钠本机生成的。这也使密码验证变得微不足道。请关注mu关于SQL注入的建议。