Recupera chiave nell'autenticazione dei messaggi HMAC-SHA256 [chiusa]

0

Sto lavorando a una dimostrazione della sicurezza dei cookie, in cui alcuni dati importanti vengono trasmessi al client insieme a un digest HMAC-SHA256 per impedire la modifica dei dati. Mi piacerebbe essere in grado di dimostrare che l'utilizzo di un tasto debole lo rende facile da decifrare.

Per generare hash e dati, ecco un semplice script python:

import hmac
from hashlib import sha256

message = "This is a long message that might be a little too long"
mkey = "password"
digest = hmac.new(mkey, message, sha256)
print(digest.hexdigest())
print(message.encode('hex'))

Emette questi dati:

e3762ae7f3bc6c9f8906e5f1f2cd19e80d3ebd281bdd31119a66adaef33d3b3c
546869732069732061206c6f6e67206d6573736167652074686174206d696768742062652061206c6974746c6520746f6f206c6f6e67

C'è qualche strumento che può aiutarmi a rompere efficacemente la chiave? Non sono riuscito a trovare un modo per farlo in hashcat.

Potrei lanciare il mio attacco del dizionario, ma preferirei usare qualcosa dal suo scaffale se esiste.

    
posta Sid 04.02.2017 - 17:26
fonte

2 risposte

2

Se vuoi proteggere il messaggio, hai un problema serio, perché può essere facilmente decodificato con:

crypto = "546869732069732061206c6f6e67206d6573736167652074686174206d696768742062652061206c6974746c6520746f6f206c6f6e67"
print crypto
print crypto.decode('hex')

Ma dal momento che hai chiesto di recuperare la password tramite attacco dizionario, ho creato uno script che decodifica l'esadecimale in testo semplice che viene poi usato come salt in HMAC insieme alle password nel dizionario e SHA256 per produrre hash (che imita l'originale Funzione HMAC) che vengono quindi confrontati con la stringa hash designata:

import hmac
from hashlib import sha256

hashd = 'e3762ae7f3bc6c9f8906e5f1f2cd19e80d3ebd281bdd31119a66adaef33d3b3c'
crypto = '546869732069732061206c6f6e67206d6573736167652074686174206d696768742062652061206c6974746c6520746f6f206c6f6e67'
decrypto = crypto.decode('hex')
keys = open('dictionary.txt').read().split() # Specifiy the path to the dictionary file

def mykey():
   for i in keys:
     digest=hmac.new(i, decrypto, sha256)
     digest.hexdigest()

     if digest.hexdigest()==hashd:
        print 'password:', i
        break

if mykey():
   print mykey()

Quindi, se la password è nel dizionario, verrà stampata. Testato in python 2.7. Si noti inoltre che le parole devono essere una per riga nel dizionario affinché funzioni correttamente.

EDIT: Ecco una versione più appariscente, nel caso tu ne abbia bisogno per la presentazione:

import hmac
from hashlib import sha256
from datetime import datetime
startTime = datetime.now()

hashd = raw_input('SHA256: ')
crypto = raw_input('HEX: ')
decrypto = crypto.decode('hex')
keys = open('dictionary').read().split() # Specifiy the path to the dictionary file

def mykey():
   for i in keys:
      digest=hmac.new(i, decrypto, sha256)
      print digest.hexdigest(), '-', i

      if digest.hexdigest()==hashd:
         print 'Password found:', i
         break
   else:
      print 'Password not in the dictionary.'

if mykey():
   print mykey()

print 'Time Elapsed:', datetime.now() - startTime
    
risposta data 05.02.2017 - 01:01
fonte
1

Risulta John the Ripper può rompere il digest HMAC (se costruito da almeno un ramo sanguinante), il che è ottimo. Non ero stato abbastanza duro.

    
risposta data 05.02.2017 - 23:54
fonte

Leggi altre domande sui tag