Oracle Hash MD5 解密

Oracle Hash MD5 decryption

我用这个方法来加密我的字符串:

RETURN RAWTOHEX(DBMS_CRYPTO.HASH(SRC=>to_hash, TYP=>dbms_crypto.HASH_MD5));

现在我有了加密的 MD5 字符串,例如:

F267E16E70C2528280A487D5D13617A6

有没有办法解密此代码以再次获取起始字符串?

MD5 是一种散列算法,并非真正用于加密或解密。 所以,不,没有办法再次获得起始字符串。实际上,给定一个散列,它可能来自许多潜在的起始字符串。

哈希函数不是isomorphic,即在一般情况下不可能反转函数并获得唯一的原始值。 这与蜜蜂 "safely decoded" 非常不同。如果有额外的知识,例如关于字符串的长度,很容易(有一些 CPU 的权力)得到所有候选字符串(即映射到目标哈希值的字符串。

所以这可能不是解码密码等的最佳方式

长度为三的字符串的简单示例:

select (DBMS_CRYPTO.HASH( RAWTOHEX('Scr'), 2 /* dbms_crypto.HASH_MD5*/ )) from DUAL;

93656D76795528C600E7BF7A17B09C8E


with chr as (
select chr(ascii('A') -1 + rownum) chr from dual connect by level <= 26
union all
select chr(ascii('a') -1 + rownum) chr from dual connect by level <= 26
union all
select chr(ascii('0') -1 + rownum) chr from dual connect by level <= 10
),
chr2 as (
select a.chr||b.chr||c.chr str
from chr a, chr b, chr c 
)
select * from chr2   
where DBMS_CRYPTO.HASH( RAWTOHEX(str), 2 /* dbms_crypto.HASH_MD5*/ ) 
 = '93656D76795528C600E7BF7A17B09C8E'
;

Scr 

哈希算法是单向函数。因此,没有可行的方法来反转所涉及的计算并得出原始输入值。进一步的哈希算法对任意长度的输入字符串进行操作,但具有固定宽度的输出,在 MD5 算法的情况下,它输出 16 字节的哈希值,可以表示 16 字节或 16,000 字节或更多的输入值。

因此,虽然您无法通过逆向算法来检索原始输入,但您可以计算潜在候选输入的哈希值,以(希望)找到与您现有哈希值匹配的哈希值。对原始输入字符串的一些了解将有助于减少这种暴力攻击的问题space。