15 febbraio 2010

Digest Integrità Dati Con Python

Il linguaggio Python, all' interno della sua libreria di base, ha diversi moduli(a seconda del sistema in uso) di natura crittografica, che sono:

hashlib algoritmo che implementa interfacce sicure per molti altri algoritmi di digest, tra i quali SHA1, SHA224, SHA256, SHA384, SHA512 e md5

md5 algoritmo di messaggi digest RSA e MD5

sha algoritmo di hash SHA

hmac algoritmo di autenticazione dei messaggi HMAC

A cosa serve una impronta di messaggio, o digest? Semplicemente serve a confrontare se un file, corrisponde in modo matematico(checksum), a quello creato in un dato momento dal creatore originario di quel file. Un esempio che ci e ricorrente, e quello che quando scarichiamo un file zip, o una libreria ajax, riportano impronte(checksum appunto)alfanumeriche accanto ad ogni file.

E giunto il momento di vedere come lavorano alcuni di questi moduli, sia nel confrontare dei file già residenti nel mio hard disk, che nel creare stringhe di testo processate dal linguaggio python.

>>> import sha
>>> oggetto_sha = sha.new()
>>> file_cp = open("C:\\Documents and Settings\\@rchieCreative\\Desktop\\klass.txt")
>>> oggetto_sha.digest()
'\x1f\x93\xb3ht\xde\xf6\xef\xb2Q\rE\x01`\x84\xbeX\x0fI\xcf'
>>> oggetto_sha.hexdigest()
'1f93b36874def6efb2510d45016084be580f49cf'

una volta che importiamo il modulo con import sha, creiamo un oggetto sha, richiamando la funzione new(), che andrebbe passata con un argomento, nel modo seguente new([messaggio]). Io negli esempi uso la funzione new(), senza alcun argomento ma passo il [messaggio] tramite .update().

Come vedete da esempio il digest, viene stampato in forma binaria, che possiamo passare tramite il metodo hexdigest(), per una più comoda lettura in esadecimale. Fondamentalmente i valori dei moduli sha e md5, che sono forniti come attributi degli oggetti restituiti dalla funzione new(), sono gli stessi per entrambi che sono:

per il modulo md5
digest_size la dimensione in bytes del digest risultante
new([arg]) restituisce un nuovo oggetto md5
md5([arg]) come la funzione new() per compatibilità all' indietro
update(arg) aggiorna oggetto md5 con la stringa arg
digest() restituisce il digest delle stringhe passate a update()
hexdigest() equivale a digest() ma stampa in esadecimale
copy() restituisce una copia clone dell'oggetto md5

per il modulo sha
new([string]) restituisce un nuovo oggetto sha
blocksize dimensione dei blocchi di passati alla funzione hash
digest_size grandezza in bytes del digest risultante
update(arg) aggiorna l' oggetto sha con la stringa arg
digest() restituisce il digest delle stringhe passate a update()
hexdigest() equivale a digest() ma stampa in esadecimale
copy() restituisce una copia clone dell'oggetto sha

una delle differenze tra il modulo sha, e il modulo md5, e quello che il modulo sha, produce digest a 160 bit, e quindi più sicuro(ma più lento), mentre il modulo md5 produce un digest di 128 bit.


Adesso e la volta del modulo md5. Le differenze con l' esempio di sopra sono sostanzialmente(a parte un nuovo file Python-mode.el) tra il primo oggetto_md5.digest(), e l' oggetto_md5.hexdigest(), che stampano il primo un digest di ritorno binario, e il secondo in esadecimale, e l' oggetto_md5.update('file_cp') che dimostra come ad ogni nuova chiamata dei metodi, sia digest() che hexdigest(), cambiano al volo il relativo digest di output del file.

>>> import md5
>>> oggetto_md5 = md5.new()
>>> file_cp = open("C:\\Documents and Settings\\@rchieCreative\\Desktop\\Python-mode.el")
>>> oggetto_md5.digest()
'\xf9p \xab\xda\x97\x8f$\xe7X\x12\x8c4!4\xe8'
>>> oggetto_md5.hexdigest()
'f97020abda978f24e758128c342134e8'
>>> oggetto_md5.update('file_cp')
>>> oggetto_md5.digest()
'\xe3\x16\x94\x10\x93\xde\x88p\xf7\xc5\xba\x95\xf2\xc3\r\x80'
>>> oggetto_md5.hexdigest()
'e316941093de8870f7c5ba95f2c30d80'




eccoci al modulo hashlib, che ingloba al suo interno interfacce comuni di algoritmi di digest, sia di sha che md5, che di altri. Come accennato precedentemente, il modulo hashlib, al suo interno ha i seguenti costruttori di algoritmi di hash che sono md5(), sha1(), sha224(), sha256(), SHA384(), e SHA512().

Gli attributi costanti e metodi di hash per hashlib sono:

digest_size() grandezza in bytes del digest risultante
block_size() dimensione dei blocchi di passati alla funzione hash
update(arg) aggiorna l' oggetto sha con la stringa arg
digest() restituisce il digest delle stringhe passate a update()
hexdigest() equivale a digest() ma stampa in esadecimale
copy() restituisce una copia clone dell'oggetto hash

in questo esempio, le differenze di rilievo, con gli esempi precedenti, sono il digest della stringa tramite il metodo update(),che restituisce il message(delle due stringhe)in un unico digest (aggiornato immediatamente), oltre alla dimensione in byte dell'hash create_hashing.digest_size di 20 byte, e le dimensioni interne del blocco di hash (sempre in byte) di 64 byte.

>>> import hashlib
>>> create_hashing = hashlib.sha1()
>>> create_hashing.update("Prima Stringa")
>>> create_hashing.update("Altra Stringa Lungaaaaaaaaa Lungaaaaaaaaaaa")
>>> create_hashing.digest()
'\xca\x0bc\xb8\xf5z\x14l\x9fAG\xe4\xad_\x9d\\K\xc5\xc8\xa8'
>>> create_hashing.digest_size
20
>>> create_hashing.block_size
64
>>> create_hashing.hexdigest()
'ca0b63b8f57a146c9f4147e4ad5f9d5c4bc5c8a8'

ed e tutto. Spero data l' ora e la cena di s.valentino che i miei occhi non mi abbiano giocato brutti scherzi!

Nessun commento: