Oracle 上的 SHA-512

shi*_*hir 0 oracle hash cryptography sha512 oracle12c

我想在 Oracle 12 上使用 SHA-512 加密一些数据。

例如,我想加密这个字符串:

230049008251111 
Run Code Online (Sandbox Code Playgroud)

对此:

DA9AA3ACDE64DB3297FF75FDE407DAF3DB7EFF0CDF987C6C16BAF28242997046997EBF5A2F6C4F7449A4936C6518A6FD24A3C0984E9C09BF19395175F1BE2B5F

这是根据我正在使用的sha512 生成器。在 Oracle 上这样做的最佳方法是什么?

谢谢

APC*_*APC 8

Oracle 具有对 SHA-512 的内置数据库支持。

如果您想要纯 SQL 的解决方案并且您的输入字符串在 SQL 字符串长度限制(4000 个字符,除非您已启用 12c 扩展 varchar2 语义)内,您可以执行以下操作:

select standard_hash ( '230049008251111', 'SHA512')
from dual
/
Run Code Online (Sandbox Code Playgroud)

如果您有更长的字符串,Oracle 提供了一个包 DBMS_CRYPTO(不要与已弃用的 DBMS_CRYPTO_TOOLKIT 混淆)。你可以这样使用它......

declare
     str clob;
     hsh raw(64);
begin      
     str := '230049008251111';
     hsh := dbms_crypto.hash (str, dbms_crypto.HASH_SH512);
     dbms_output.put_line(hsh);
end;
/
Run Code Online (Sandbox Code Playgroud)

...或任何对您的应用程序有意义的东西。有dbms_crypto.hash()BLOB、CLOB 和 RAW三种变体。普通的旧 varchar2 没有变体。不知道为什么。了解更多

这两个调用都产生相同的输出(如预期的那样):

DA9AA3ACDE64DB3297FF75FDE407DAF3DB7EFF0CDF987C6C16BAF28242997046997EBF5A2F6C4F7449A4936C6518A6FD24A3C0984E9C09BF19395175F1BE2B5F
Run Code Online (Sandbox Code Playgroud)

正如@WernfriedDomscheit 所观察到的,默认情况下不授予在 DBMS_CRYPTO 上执行。然而,STANDARD_HASH()是。因此,根据您的要求,您可能需要与 DBA 团队合作以获得必要的权限。

  • 请注意,默认情况下,普通用户对“DBMS_CRYPTO”包没有执行权限。您可以要求您的 DBA 授予它。 (4认同)