什么';这是Java(Scala)中此哈希代码的等效SQL代码

什么';这是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'

我有以下正在散列用户密码的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') 
不起作用,我猜这是因为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)
不会导致异常。它只是将不可映射的字节转换为替换字符。所以你必须修改你的代码。