首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python和oracle sql中的哈希不匹配。

python和oracle sql中的哈希不匹配。
EN

Stack Overflow用户
提问于 2018-06-21 22:25:38
回答 2查看 406关注 0票数 2

我必须使用函数来生成随机元素的散列(sha512)。第一个是oracle sql查询:

代码语言:javascript
复制
select RAND, DBMS_CRYPTO.HASH(RAND, 6 /*SHA512*/) as sha512 from 
    (select DBMS_CRYPTO.RANDOMBYTES(5) as RAND from DUAL);

它会返回

代码语言:javascript
复制
RAND
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SHA512                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C1BEC41854                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
E4BD639D4726D294CB63B6DDC651C6B6F5708ED3FC9B2E08A71DD7D36958B7B13BD31ECA28039565121F3067167D719292A86B6CAD052EFC9A56923594946084

当我尝试在python中为C1BEC41854生成散列时,我使用以下脚本

代码语言:javascript
复制
from hashlib import sha512
h = 'C1BEC41854'
b = bytes.fromhex(h)
print(sha512(b).hexdigest())

它会返回

代码语言:javascript
复制
a63f4d25b5f0fc51fb27ae1e1c5f4ff19edc7b790d2373071ae8f454e63766a19b69a200690a32a65dd57be5b47fec29ee15c354f52ad5916127bb4cf674ab37

你能帮我弄清楚为什么这两个哈希值不一样吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-21 23:51:22

在Oracle查询中,您将生成多个随机字节字符串。

试着这样演示一下:

代码语言:javascript
复制
select RAND, RAND, RAND, DBMS_CRYPTO.HASH(RAND, 6 /*SHA512*/) as sha512 from 
    (select DBMS_CRYPTO.RANDOMBYTES(5) as RAND from DUAL);

请注意RAND的三个不同值。因此,您生成的散列实际上是针对一个不同的字节序列,而不是您认为的。

要修复它,您可以使用AskTom提供的这个小技巧

代码语言:javascript
复制
select RAND,DBMS_CRYPTO.HASH(RAND, 6 /*SHA512*/) as sha512 from 
    (select rownum, DBMS_CRYPTO.RANDOMBYTES(5) as RAND from DUAL);

在子查询中包含rownum使得每次将其用作顶级SELECT中的字段时,RAND保持一致。

AskTom Question on the subject

票数 3
EN

Stack Overflow用户

发布于 2018-06-22 03:39:45

这将为您提供相同的结果(大写):

代码语言:javascript
复制
SELECT sys.dbms_crypto.hash(
  hextoraw('C1BEC41854'),
  6--HASH_SH512
) from dual;

看起来你的字符串已经是十六进制值了,所以我刚刚做了一个十六进制数。如果它是像'Hello‘这样的基本字符串,那么我会使用utl_raw.cast_to_raw

输出:

代码语言:javascript
复制
A63F4D25B5F0FC51FB27AE1E1C5F4FF19EDC7B790D2373071AE8F454E63766A19B69A200690A32A65DD57BE5B47FEC29EE15C354F52AD5916127BB4CF674AB37
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50970937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档