【问题标题】:Oracle Hash MD5 decryptionOracle Hash MD5 解密
【发布时间】:2015-07-16 10:25:35
【问题描述】:

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

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

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

F267E16E70C2528280A487D5D13617A6

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

【问题讨论】:

    标签: sql oracle plsql md5


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      哈希函数不是isomorphic,即一般情况下不可能将函数取反得到唯一的原始值。 这与“安全解码”非常不同。如果有额外的知识,例如关于字符串的长度,很容易(使用一些 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 
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-18
          • 1970-01-01
          • 1970-01-01
          • 2014-02-20
          相关资源
          最近更新 更多