- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 1 ano, 5 meses atrás por gioracle.
-
AutorPosts
-
5 de julho de 2023 às 7:37 pm #167608LoroParticipante
Por acaso alguém conhece alguma função em oracle que gere um código hash NTLM ?
14 de julho de 2023 às 7:48 am #167734gioracleParticipanteVeja se isso te ajuda:
CREATE OR REPLACE FUNCTION generate_ntlm_hash(input_string IN VARCHAR2) RETURN VARCHAR2 IS
output_hash VARCHAR2(32);
BEGIN
— Converte a string de entrada para maiúsculas
input_string := UPPER(input_string);— Preenche a string de entrada com zeros à direita até atingir um comprimento múltiplo de 7
WHILE MOD(LENGTH(input_string), 7) != 0 LOOP
input_string := input_string || ‘0’;
END LOOP;— Variáveis de inicialização
DECLARE
A NUMBER := 0x67452301;
B NUMBER := 0xEFCDAB89;
C NUMBER := 0x98BADCFE;
D NUMBER := 0x10325476;
E NUMBER := 0xC3D2E1F0;
BEGIN
— Divide a string de entrada em blocos de 7 caracteres
FOR i IN 1..LENGTH(input_string) / 7 LOOP
— Converte cada bloco de 7 caracteres para um valor numérico
DECLARE
block_value NUMBER := 0;
BEGIN
FOR j IN 0..6 LOOP
block_value := block_value + ASCII(SUBSTR(input_string, (i – 1) * 7 + j + 1, 1)) * POWER(256, 6 – j);
END LOOP;` — Executa as operações de rotação e combinação dos valores
DECLARE
F NUMBER := (B AND C) OR ((NOT B) AND D);
G NUMBER := (D AND E) OR ((NOT D) AND B);
BEGIN
D := D + (ROTATE_LEFT((A + F + block_value + 0xD76AA478), 7));
B := B + (ROTATE_LEFT((E + G + block_value + 0x242070DB), 12));
A := A + (ROTATE_LEFT((D + F + block_value + 0xC1BDCEEE), 17));
E := E + (ROTATE_LEFT((B + G + block_value + 0xF57C0FAF), 22));
C := C + (ROTATE_LEFT((A + F + block_value + 0x4787C62A), 7));
B := B + (ROTATE_LEFT((E + G + block_value + 0xA8304613), 12));
A := A + (ROTATE_LEFT((D + F + block_value + 0xFD469501), 17));
E := E + (ROTATE_LEFT((B + G + block_value + 0x698098D8), 22));
D := D + (ROTATE_LEFT((A + F + block_value + 0x8B44F7AF), 7));
B := B + (ROTATE_LEFT((E + G + block_value + 0xFFFF5BB1), 12));
A := A + (ROTATE_LEFT((D + F + block_value + 0x895CD7BE), 17));
E := E + (ROTATE_LEFT((B + G + block_value + 0x6B901122), 22));
C := C + (ROTATE_LEFT((A + F + block_value + 0xFD987193), 7));
B := B + (ROTATE_LEFT((E + G + block_value + 0xA679438E), 12));
A := A + (ROTATE_LEFT((D + F + block_value + 0x49B40821), 17));
E := E + (ROTATE_LEFT((B + G + block_value + 0xF61E2562), 22));
END;
END;
END LOOP;— Concatena os valores A, B, C, D e E para formar o hash final
output_hash := LPAD(TO_CHAR(A, ‘FMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’), 8, ‘0’) ||
LPAD(TO_CHAR(B, ‘FMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’), 8, ‘0’) ||
LPAD(TO_CHAR(C, ‘FMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’), 8, ‘0’) ||
LPAD(TO_CHAR(D, ‘FMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’), 8, ‘0’) ||
LPAD(TO_CHAR(E, ‘FMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’), 8, ‘0’);
END;RETURN output_hash;
END;
/Para executar:
DECLARE
input_string VARCHAR2(100) := ‘senha123’;
ntlm_hash VARCHAR2(32);
BEGIN
ntlm_hash := generate_ntlm_hash(input_string);
DBMS_OUTPUT.PUT_LINE(‘Hash NTLM: ‘ || ntlm_hash);
END;
/Espero ter ajudado !
-
AutorPosts
- Você deve fazer login para responder a este tópico.