列值是否为哈希值



如何识别oracle中的列是使用DBMS_CRYPTO.HASH或DBMS_OBFUSCATION_TOOLKIT.MD5加密还是不使用加密

HASH值表

是否有任何函数可以在oracle数据库的所有列中运行(all_TAB_columns(,如果列是否加密,该函数将返回true?

我认为很难识别加密的列。但是,应该很容易找到候选列,因为它们通常只包含十六进制数据,并且长度固定。

在Oracle中,有两种常见的存储十六进制数据的方法,一种是RAW,另一种是字符串(CHARVARCHAR2等(。RAW是原始数据的正确数据类型,因为您没有字符集问题,而且它对字符大小写没有任何疑问(f6099c0与f6099c0相同(,只有其大小的一半。然而,根据我的经验,字符串的使用频率更高,这主要是因为开发人员从未听说过RAW数据类型。不过,在你寻找哈希的过程中,你必须同时寻找两者。

一些示例数据:

CREATE TABLE t (
md5r  RAW(16), 
md5v  CHAR(32),
sha1r RAW(20),
sha1v CHAR(40)
);
INSERT INTO t
SELECT md5raw, rawtohex(md5raw) as md5str,
sh1raw, rawtohex(sh1raw) as sh1str
FROM (SELECT DBMS_CRYPTO.Hash(tr, 2) AS md5raw,
DBMS_CRYPTO.Hash(tr, 3) AS sh1raw
FROM (SELECT UTL_I18N.STRING_TO_RAW (tv, 'AL32UTF8') AS tr
FROM (SELECT object_name as tv FROM dba_objects where rownum <= 10)));
EXEC dbms_stats.gather_table_stats(null, 't');

现在,您可以通过列中最高值与最低值一样长的事实来筛选出候选列。由于低/高值存储为十六进制字符串,因此MD5需要将长度加倍(相当令人困惑(,达到32/64,SHA1需要加倍(40/80(,等等:

SELECT owner, table_name, column_name, data_type, data_length
FROM all_tab_columns 
WHERE data_type = 'RAW' 
AND LENGTH(low_value)=40 AND LENGTH(high_value)=40;
T SHA1R RAW 20
SELECT owner, table_name, column_name, data_type, data_length
FROM all_tab_columns 
WHERE data_type IN ('CHAR','VARCHAR','VARCHAR2')
AND LENGTH(low_value)=80 AND LENGTH(high_value)=80;
T SHA1V CHAR 40

接下来,我会检查表中的所有值是否都是这些候选者的固定长度。如果桌子很大,我会从一个小样品开始。例如,对于sha1r:列

SELECT min(length(sha1r)) as min_len, 
max(length(sha1r)) as max_len, 
count(*) as n 
FROM t SAMPLE (0.1);

接下来,如果字符串版本都是十六进制字符,我会检查它们(原始版本显然不需要这样(:

SELECT sha1v, CASE WHEN (REGEXP_LIKE(sha1v,'^[0-9A-Fa-f]*$')) THEN 1 ELSE 0 END as hex
FROM t;

现在您可以使用以下工具https://code.google.com/archive/p/hash-identifier/,以检查哈希类型。

您的示例F6099C0932D0E2B13286219F99C265975B33FD84导致

Possible Hashs:
[+]  SHA-1
[+]  MySQL5 - SHA-1(SHA-1($pass))

顺便说一句,请使用文本而不是图像,我不得不在你的例子中手动键入来尝试,而不是复制和粘贴,这很痛苦。

最新更新