【发布时间】:2014-06-16 07:27:22
【问题描述】:
我正在尝试在 Oracle 11g 中使用 Bcrypt 算法保存用户密码。我知道这可以在 Java 中轻松完成,但在这种情况下,我想在 DB 端执行此操作。任何人都可以帮助我实现这一目标。
目前我正在使用 SHA256,这是通过 Java 存储过程完成的,因为 11g 仅支持 SHA1.. :(
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED SHA256 AS
import java.security.MessageDigest;
import oracle.sql.*;
public class SHA256
{
public static oracle.sql.RAW get_digest( String p_string ) throws Exception
{
MessageDigest v_md = MessageDigest.getInstance( "SHA-256" );
byte[] v_digest;
v_digest = v_md.digest( p_string.getBytes( "UTF-8" ) );
return RAW.newRAW(v_digest);
}
}
CREATE OR REPLACE FUNCTION SHA256_ENCRYPT(p_string VARCHAR2)
RETURN RAW
AS
LANGUAGE JAVA
NAME 'SHA256.get_digest( java.lang.String ) return oracle.sql.RAW';
对于那些感兴趣的人,Bcrypt 的最终工作副本在Oracle11g!
【问题讨论】:
-
我认为您不想使用 SHA 加密密码是对的 - 也许从这里开始:stackoverflow.com/a/11087219/103295
-
您好 Jeffrey,但我已经浏览了链接,如果我是正确的,解决方案指的是 dbms_crypto。不幸的是,Oracle 11g 仅支持 SHA1,这就是为什么我试图在 Java SP 模型 - BCrypt 中做到这一点。
-
是的,这不是您问题的完整解决方案。那是我能找到的最接近的——也就是说,基本上你现在最好的选择是使用已建立的(受信任的)Java 实现并将其包装在 PL/SQL 函数中(就像你对 SHA256 实现所做的那样)。除了出于游戏/测试目的之外,我会谨慎尝试在 PL/SQL 中构建一个简单的实现。
-
确实是这样。好吧,让我尝试使用现有的 Java 实现并构建一个 PL/SQL 函数。将返回结果。同时,如果有人已经这样做了,请回复。
-
我确实设法使用 Java 存储过程实现了 BCrypt。但是使用 Java 存储过程是否安全,或者换句话说,它是一种标准做法。
标签: oracle encryption oracle11g bcrypt java-stored-procedures