什么';这是Java(Scala)中此哈希代码的等效SQL代码
我有以下正在散列用户密码的Scala代码:什么';这是Java(Scala)中此哈希代码的等效SQL代码,java,postgresql,scala,Java,Postgresql,Scala,我有以下正在散列用户密码的Scala代码: val digest = MessageDigest.getInstance("SHA-256") val hash = new String(digest.digest (password.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8).getBytes 我想在我的PostgresSQL服务器中使用SQL执行同样的操作 我试过了 digest(password, 'sha256'
val digest = MessageDigest.getInstance("SHA-256")
val hash = new String(digest.digest (password.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8).getBytes
我想在我的PostgresSQL服务器中使用SQL执行同样的操作
我试过了
digest(password, 'sha256')
不起作用,我猜这是因为java中的getBytes
调用,我们正在消化字符串的字节,而不是字符串本身(如果有意义的话!)
Postgress SQL的getBytes
等效于什么?是否存在
多谢各位
上下文
我只是想做一个查询,手动插入一个用户以便于测试,它正在插入,但我无法登录。我的查询和scala代码生成的摘要不一样
val hash = new String(digest.digest (password.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8).getBytes
那是错误的。您正确地散列了密码,然后出于某种原因将字节转换为字符串…结果又将其转换为字节。这是不必要的,愚蠢的,而且很可能会破坏事物
val hash = digest.digest (password.getBytes(StandardCharsets.UTF_8))
这是以字节为单位的散列
要模拟您的错误代码,请尝试convert_from(摘要(密码'sha256'),'UTF8')::bytea
,然后查看是否得到相同的结果
那是错误的。您正确地散列了密码,然后出于某种原因将字节转换为字符串…结果又将其转换为字节。这是不必要的,愚蠢的,而且很可能会破坏事物
val hash = digest.digest (password.getBytes(StandardCharsets.UTF_8))
这是以字节为单位的散列
要模拟你的破译代码,请尝试转换(摘要(密码,'sha256'),'UTF8')::bytea,看看是否得到相同的结果。事实上,
1962
和password
@Kayaman的哈希值不同是件好事,这是一个例子:D,让我编辑digest()
也会将其转换为字节,别担心。哈希是从字节创建的,而不是从字符创建的。不过,您确实需要确保使用相同的编码,否则更多的外来字符将不会被转换为相同的字节。@Kayaman,但它不会给出scala生成的相同哈希,这很奇怪,可能是因为您试图将哈希转换为字符串。哈希是字节,而不是字符串digest.digest(password.getBytes(StandardCharsets.UTF_8))
就是你所需要做的一切。实际上,1962
和password
@Kayaman的散列是不同的,这是一个例子:D,让我编辑digest()
也会将其转换为字节,不用担心。哈希是从字节创建的,而不是从字符创建的。不过,您确实需要确保使用相同的编码,否则更多的外来字符将不会被转换为相同的字节。@Kayaman,但它不会给出scala生成的相同哈希,这很奇怪,可能是因为您试图将哈希转换为字符串。哈希是字节,而不是字符串digest.digest(password.getBytes(StandardCharsets.UTF_8))
是您所需要做的一切。我完全同意,但这已经在prod中使用了两年多了。如果我改变它,所有的老用户将无法登录。所以我在寻找一种方法来解决这个问题。那么你在寻找一种方法来在Postgres中实现一个被破坏的散列机制?您可以尝试将摘要的结果返回到文本
并返回到bytea
,这就是代码所做的,也许您会很幸运并得到相同的结果。我很不好意思这么说,但是的:这里有标准的转换(以:
为简写),但是您应该使用convert\u from
功能。在答案中看到我的编辑。那太糟糕了,因为你猜怎么着<代码>新字符串(哈希,StandardCharsets.UTF_8)
不会导致异常。它只是将不可映射的字节转换为替换字符。所以你必须修改你的代码。我完全同意,但这已经在prod中使用了两年多了。如果我改变它,所有的老用户将无法登录。所以我在寻找一种方法来解决这个问题。那么你在寻找一种方法来在Postgres中实现一个被破坏的散列机制?您可以尝试将摘要的结果返回到文本
并返回到bytea
,这就是代码所做的,也许您会很幸运并得到相同的结果。我很不好意思这么说,但是的:这里有标准的转换(以:
为简写),但是您应该使用convert\u from
功能。在答案中看到我的编辑。那太糟糕了,因为你猜怎么着<代码>新字符串(哈希,StandardCharsets.UTF_8)
不会导致异常。它只是将不可映射的字节转换为替换字符。所以你必须修改你的代码。