Home Hardware Networking Programmazione Software Domanda Sistemi
Conoscenza del computer >> Programmazione >> rubino Programmazione >> .

Cos'è un hash e come ha usato nella programmazione?

Cos'è un hash?

Nel contesto dell'informatica e della programmazione, un hash (noto anche come codice hash, valore hash o digest dei messaggi) è una rappresentazione numerica di dimensioni fisse di un dati di input di dimensioni arbitrarie. Pensalo come un'impronta digitale per un dato.

Il processo di generazione di un hash è chiamato hashing ed è eseguito da una funzione hash .

Caratteristiche chiave delle funzioni di hash:

* deterministico: Per gli stessi dati di input, la funzione hash produrrà sempre lo stesso valore di hash.

* a senso unico (idealmente): Dovrebbe essere computazionalmente impossibile invertire la funzione hash per determinare l'input originale dal suo valore di hash. (Questo è più critico per le funzioni di hash crittografiche.)

* Output di dimensioni fisse: Indipendentemente dalle dimensioni dei dati di input, la funzione hash genera un valore di hash di una dimensione specifica e predeterminata (ad esempio, 32 bit, 64 bit, 256 bit).

* Resistenza alla collisione (idealmente): Una buona funzione hash dovrebbe ridurre al minimo la probabilità di input diversi che producono lo stesso valore di hash (una "collisione"). Mentre le collisioni sono inevitabili, dovrebbero essere rare.

Analogia:

Immagina di avere un documento (i dati di input). Una funzione hash è come una macchina che riassume quel documento in un breve riepilogo a lunghezza fissa (valore hash). Il riepilogo dovrebbe essere:

* Coerente: Lo stesso documento produce sempre lo stesso riepilogo.

* unico (per quanto possibile): Documenti diversi dovrebbero idealmente produrre sintesi diversi.

* irreversibile (idealmente): Non puoi ricreare il documento originale solo dal suo riepilogo.

Come vengono utilizzati gli hash nella programmazione

Gli hash hanno numerose applicazioni nella programmazione e nelle strutture di dati:

1. Strutture di dati (tabelle hash/mappe hash):

* Questo è l'uso più comune. Le tabelle hash vengono utilizzate per l'archiviazione efficiente e il recupero dei dati in base alle chiavi.

* Come funziona: Una funzione hash converte la chiave in un indice (valore hash) all'interno di un array. Il valore associato alla chiave viene archiviato in quell'indice.

* Vantaggi: Fornisce una ricerca media (O (1) complessità) molto rapida perché l'indice viene calcolato direttamente dalla chiave.

* Esempio: Dizionari di Python, mappe in Java, oggetti come array associativi in ​​JavaScript.

`` `Python

Dizionario Python (un'implementazione della tabella hash)

my_dict ={"Apple":1, "Banana":2, "Orange":3}

Stampa (my_dict ["Apple"]) # Accesso al valore utilizzando la chiave "Apple" - O (1) Tempo medio

`` `

2. Verifica di integrità dei dati:

* Gli hash possono essere utilizzati per garantire che i dati non siano stati manomessi durante la trasmissione o l'archiviazione.

* Come funziona: Calcola l'hash dei dati prima di inviarli o memorizzarli. Successivamente, ricalcola l'hash e confrontalo con il valore di hash originale. Se gli hash corrispondono, i dati sono probabilmente invariati.

* Esempio: Checksum, verifica dell'integrità dei file nei download di software, rilevamento di dati corrotti nei database.

`` `Python

Importa hashlib

data ="Questi sono i miei dati."

hash_object =hashlib.md5 (data.encode ()) #enCode converte la stringa in byte

md5_hash =hash_object.hexdigest ()

print (f "md5 hash:{md5_hash}")

`` `

3. Archiviazione password:

* La memorizzazione di password direttamente in un database è un rischio per la sicurezza. Gli hash vengono utilizzati per archiviare una rappresentazione a senso unico della password.

* Come funziona: Quando un utente crea un account, la password viene hash (di solito con un "sale" - una stringa casuale aggiunta alla password prima dell'hashing). L'hash è archiviato, non la password effettiva. Quando l'utente accede, anche la password immessa viene hash (con lo stesso sale) e l'hash risultante viene confrontato con l'hash immagazzinato.

* Vantaggi: Anche se il database è compromesso, gli aggressori non possono recuperare direttamente le password.

* Considerazioni sulla sicurezza: Gli algoritmi di hashing della password moderni (come BCrypt, Scirypt, Argon2) sono deliberatamente lenti e usano sali per renderli resistenti agli attacchi a forza bruta e agli attacchi del tavolo arcobaleno.

`` `Python

Importa bcrypt

password =b "my_secret_password" # password come byte

Genera un sale

Salt =bcrypt.gensalt ()

hash la password con sale

hashed_password =bcrypt.hashpw (password, sale)

print (f "password hashed:{hashed_password}")

Per verificare la password in seguito:

Entered_Password =b "my_secret_password"

Se bcrypt.checkpw (Enterd_Password, hashed_password):

Stampa ("Password corrisponde!")

altro:

Stampa ("La password non corrisponde.")

`` `

4. Caching:

* Gli hash possono essere utilizzati per creare tasti di cache per la memorizzazione dei risultati di calcoli costosi.

* Come funziona: I parametri di input per una funzione (o lo stato di un sistema) sono hash e il valore hash viene utilizzato come chiave in una cache (come una tabella hash). Se si riscontra nuovamente lo stesso input, il risultato memorizzata nella cache può essere recuperato direttamente, evitando la ricomposizione.

* Esempio: Memorizzazione, memorizzazione nella memorizzazione nella cache dei dati frequentemente accessibili nelle applicazioni Web.

5. Deduplicazione dei dati:

* Gli hash possono essere utilizzati per identificare elementi di dati duplicati.

* Come funziona: Quando devono essere archiviati nuovi dati, viene calcolato il suo hash. Se l'hash esiste già in un database di hash noti, i dati sono probabilmente duplicati e possono essere saltati (o archiviati una sola volta).

* Esempio: Sistemi di archiviazione, servizi di condivisione di file.

6. Filtri Bloom:

* Strutture di dati probabilistiche che utilizzano hashing per verificare se un elemento è un membro di un set. I filtri Bloom possono avere falsi positivi (potrebbero dire che un elemento è nel set quando non lo è), ma non hanno mai falsi negativi (non diranno mai che un elemento non è nel set se lo è).

7. Crittografia:

* Le funzioni di hash crittografiche (SHA-256, SHA-3, ecc.) Vengono utilizzate per vari scopi di sicurezza, tra cui:

* Firme digitali:creazione di un hash di un documento e quindi crittografare l'hash con una chiave privata.

* Codici di autenticazione dei messaggi (Mac):creazione di un hash che dipende da una chiave segreta, utilizzata per verificare sia l'integrità che l'autenticità.

* Criptovalute:hashing è fondamentale per la tecnologia blockchain per creare blocchi e verificare le transazioni.

funzioni di hash comuni

Ci sono molte diverse funzioni di hash. Ecco alcuni esempi:

* md5 (Message Digest 5): (Domance per applicazioni sensibili alla sicurezza perché è vulnerabile alle collisioni). Genera un hash a 128 bit.

* sha-1 (algoritmo hash sicuro 1): (Anche deprecato per applicazioni sensibili alla sicurezza dovute a vulnerabilità). Genera un hash a 160 bit.

* sha-2 (algoritmo hash sicuro 2): Una famiglia di funzioni hash, tra cui SHA-256 (hash a 256 bit), SHA-384 (hash 384-bit) e SHA-512 (hash 512-bit). Generalmente considerato più sicuro di MD5 e SHA-1.

* sha-3 (algoritmo hash sicuro 3): Una diversa famiglia di funzioni hash scelte in una competizione NIST. Offre un design diverso da SHA-2.

* bcrypt, scrypt, argon2: Algoritmi di hashing password progettati per essere lenti e resistenti agli attacchi. Queste non sono funzioni di hash generiche; Sono specificamente per l'archiviazione delle password.

* Murmurhash, FNV Hash: Funzioni di hash non crittografiche spesso utilizzate per le implementazioni della tabella di hash in cui la velocità è importante.

Considerazioni importanti

* Collisioni: Le collisioni sono inevitabili, soprattutto quando si tratta di set di dati di grandi dimensioni. Le buone implementazioni della tabella hash hanno strategie di risoluzione delle collisioni (ad esempio, concatenamento separato, indirizzamento aperto) per gestire le collisioni in modo efficiente.

* Scelta della funzione hash: La scelta della funzione hash dipende dall'applicazione. Per applicazioni sensibili alla sicurezza, utilizzare funzioni di hash crittografiche. Per le tabelle hash, scegli una funzione hash che distribuisce le chiavi uniformemente attraverso la tabella per ridurre al minimo le collisioni.

* Sicurezza: Se si utilizza Hashes per la sicurezza (archiviazione password, integrità dei dati), utilizzare funzioni di hash crittografiche forti e moderne (BCRYPT, ARGON2, SHA-256, SHA-3) e tecniche di salting adeguate. Evitare l'utilizzo di MD5 o SHA-1 per la sicurezza.

* Performance: Le funzioni di hash variano nelle loro prestazioni. Profila il tuo codice per determinare se il processo di hashing è un collo di bottiglia e scegli una funzione hash adatta per le tue esigenze.

In sintesi, un hash è uno strumento prezioso nella programmazione, fornendo un modo per rappresentare i dati in un formato compatto di dimensioni fisse per strutture di dati efficienti, controlli di integrità, sicurezza e varie altre applicazioni. La scelta della giusta funzione di hash e la gestione delle collisioni sono importanti per raggiungere prestazioni e sicurezza ottimali.

 

Programmazione © www.354353.com