Differenza fondamentale tra algoritmi di hash e crittografia


509

Vedo molta confusione tra hash e algoritmi di crittografia e vorrei sentire alcuni consigli più esperti su:

  1. Quando utilizzare hash vs crittografie

  2. Ciò che rende un algoritmo di hash o crittografia diverso (da un livello teorico / matematico) cioè ciò che rende gli hash irreversibili (senza l'aiuto di un albero arcobaleno)

Ecco alcune domande SO simili che non sono entrate nei dettagli che cercavo:

Qual è la differenza tra Obfuscation, Hashing e Encryption?
Differenza tra crittografia e hash


28
Posso prevedere che questa sia la domanda a cui riferire le persone quando confondono i termini. :)
Adam Paynter,

18
l'hash è unidirezionale (non può essere ripristinato), la crittografia è bidirezionale (può essere decifrata)
bestsss

Gli hash sono utili anche per indicizzare strutture e oggetti di grandi dimensioni, ad esempio file. Vedi tabella hash .
HABO,

22
L'hashing è come un tritacarne. Puoi trasformare una mucca in hamburger, ma non il contrario.
Neil McGuigan,

Ho notato che la mia domanda è stata modificata. Avevo sempre conosciuto le differenze di livello superiore tra i due, ma ero più curioso di differenze matematiche / di basso livello. :) Ad ogni modo, un sacco di buoni contenuti per SO! Grazie molto!
Kenny Cason,

Risposte:


738

Bene, potresti cercarlo su Wikipedia ... Ma poiché vuoi una spiegazione, farò del mio meglio qui:

Funzioni hash

Forniscono una mappatura tra un input di lunghezza arbitraria e un output (di solito) a lunghezza fissa (o di lunghezza inferiore). Può essere qualsiasi cosa, da un semplice crc32, a una funzione di hash crittografica completa come MD5 o SHA1 / 2/256/512. Il punto è che c'è una mappatura a senso unico in corso. È sempre un mapping molti: 1 (nel senso che ci saranno sempre collisioni) poiché ogni funzione produce un output più piccolo di quello che è in grado di immettere (Se si alimenta ogni possibile file 1mb in MD5, si otterranno tonnellate di collisioni).

Il motivo per cui sono difficili (o impossibili nella pratica) da invertire è il modo in cui lavorano internamente. La maggior parte delle funzioni hash crittografiche ripetono più volte l'input impostato per produrre l'output. Quindi se osserviamo ogni blocco di input a lunghezza fissa (che dipende dall'algoritmo), la funzione hash chiamerà quello stato corrente. Quindi ripeterà lo stato e lo cambierà in uno nuovo e lo utilizzerà come feedback in sé (MD5 lo fa 64 volte per ogni blocco di dati a 512 bit). Quindi in qualche modo combina gli stati risultanti di tutte queste iterazioni insieme per formare l'hash risultante.

Ora, se vuoi decodificare l'hash, devi prima capire come dividere l'hash dato nei suoi stati iterati (1 possibilità per input più piccoli delle dimensioni di un blocco di dati, molti per input più grandi). Quindi dovrai invertire l'iterazione per ogni stato. Ora, per spiegare il motivo per cui questo è molto difficile, Immaginate di provare a dedurre ae bdalla seguente formula: 10 = a + b. Ci sono 10 combinazioni positive di ae bche possono funzionare. Ora ripetilo più volte:tmp = a + b; a = b; b = tmp. Per 64 iterazioni, avresti più di 10 ^ 64 possibilità da provare. E questa è solo una semplice aggiunta in cui un certo stato viene preservato dall'iterazione all'iterazione. Le funzioni hash reali eseguono molto più di 1 operazione (MD5 esegue circa 15 operazioni su 4 variabili di stato). E poiché la successiva iterazione dipende dallo stato della precedente e la precedente viene distrutta nella creazione dello stato corrente, è quasi impossibile determinare lo stato di input che ha portato a un determinato stato di output (per ogni iterazione non meno). Combina che, con il gran numero di possibilità coinvolte, e la decodifica anche un MD5 richiederà una quantità quasi infinita (ma non infinita) di risorse. Così tante risorse che

Funzioni di crittografia

Forniscono una mappatura 1: 1 tra input e output di lunghezza arbitraria. E sono sempre reversibili. La cosa importante da notare è che è reversibile usando un metodo. Ed è sempre 1: 1 per una determinata chiave. Ora, ci sono più input: coppie di chiavi che potrebbero generare lo stesso output (in realtà ce ne sono, a seconda della funzione di crittografia). I buoni dati crittografati sono indistinguibili dal rumore casuale. Questo è diverso da un buon output hash che ha sempre un formato coerente.

Casi d'uso

Utilizzare una funzione hash quando si desidera confrontare un valore ma non è possibile memorizzare la rappresentazione semplice (per un numero qualsiasi di motivi). Le password dovrebbero adattarsi molto bene a questo caso d'uso poiché non si desidera memorizzarle come testo normale per motivi di sicurezza (e non dovrebbero). E se volessi controllare un file system per i file musicali piratati? Non sarebbe pratico memorizzare 3 MB per file musicale. Quindi, invece, prendi l'hash del file e memorizzalo (md5 memorizzerebbe 16 byte invece di 3mb). In questo modo, devi solo eseguire l'hashing di ogni file e confrontarlo con il database memorizzato degli hash (questo non funziona altrettanto bene in pratica a causa della ricodifica, della modifica delle intestazioni dei file, ecc., Ma è un esempio di caso d'uso).

Utilizzare una funzione hash quando si verifica la validità dei dati di input. Ecco per cosa sono progettati. Se hai 2 input e vuoi verificare se sono uguali, esegui entrambi tramite una funzione hash. La probabilità di una collisione è astronomicamente bassa per input di piccole dimensioni (presupponendo una buona funzione hash). Ecco perché è consigliato per le password. Per password fino a 32 caratteri, md5 ha 4 volte lo spazio di output. SHA1 ha 6 volte lo spazio di uscita (circa). SHA512 ha circa 16 volte lo spazio di uscita. In realtà non importa ciò che la password era , ti importa se è la stessa di quella che è stata memorizzata. Ecco perché dovresti usare gli hash per le password.

Utilizzare la crittografia ogni volta che è necessario ripristinare i dati di input. Nota la parola bisogno . Se stai memorizzando i numeri delle carte di credito, devi recuperarli a un certo punto, ma non vuoi memorizzarli come testo semplice. Quindi, invece, archivia la versione crittografata e mantieni la chiave il più sicura possibile.

Le funzioni hash sono ottime anche per la firma dei dati. Ad esempio, se si utilizza HMAC, si firma un pezzo di dati prendendo un hash dei dati concatenati con un valore noto ma non trasmesso (un valore segreto). Quindi, si invia il testo normale e l'hash HMAC. Quindi, il destinatario esegue semplicemente l'hashing dei dati inviati con il valore noto e verifica se corrisponde all'HMAC trasmesso. Se è lo stesso, sai che non è stato manomesso da una parte senza il valore segreto. Questo è comunemente usato nei sistemi di cookie sicuri dai framework HTTP, così come nella trasmissione di messaggi di dati su HTTP dove si desidera avere una certa integrità nei dati.

Una nota sugli hash per le password:

Una caratteristica chiave delle funzioni crittografiche dell'hash è che dovrebbero essere molto veloci da creare e molto difficili / lenti da invertire (al punto che è praticamente impossibile). Ciò pone un problema con le password. Se immagazzini sha512(password), non stai facendo nulla per proteggerti da tavoli arcobaleno o attacchi di forza bruta. Ricorda, la funzione hash è stata progettata per la velocità. Quindi è banale per un utente malintenzionato eseguire un dizionario attraverso la funzione hash e testare ogni risultato.

L'aggiunta di un sale aiuta le cose poiché aggiunge un po 'di dati sconosciuti all'hash. Quindi, invece di trovare qualcosa che corrisponda md5(foo), hanno bisogno di trovare qualcosa che quando viene aggiunto al sale noto produce md5(foo.salt)(che è molto più difficile da fare). Ma non risolve ancora il problema della velocità poiché se conoscono il sale è solo una questione di eseguire il dizionario.

Quindi, ci sono modi per affrontarlo. Un metodo popolare è chiamato rafforzamento delle chiavi (o allungamento delle chiavi). Fondamentalmente, ripeti più volte un hash (di solito migliaia). Questo fa due cose. Innanzitutto, rallenta significativamente il runtime dell'algoritmo di hashing. In secondo luogo, se implementato correttamente (passando l'input e saltando indietro su ogni iterazione) aumenta effettivamente l'entropia (spazio disponibile) per l'output, riducendo le possibilità di collisioni. Un'implementazione banale è:

var hash = password + salt;
for (var i = 0; i < 5000; i++) {
    hash = sha512(hash + password + salt);
}

Esistono altre implementazioni più standard come PBKDF2 , BCrypt . Ma questa tecnica è utilizzata da parecchi sistemi relativi alla sicurezza (come PGP, WPA, Apache e OpenSSL).

La linea di fondo, hash(password)non è abbastanza buona. hash(password + salt)è meglio, ma non è ancora abbastanza buono ... Usa un meccanismo di hash esteso per produrre gli hash delle password ...

Un'altra nota sullo stretching banale

Non alimentare in nessun caso l'output di un hash direttamente nella funzione hash :

hash = sha512(password + salt); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); // <-- Do NOT do this!
}

La ragione di ciò ha a che fare con le collisioni. Ricorda che tutte le funzioni hash hanno delle collisioni perché il possibile spazio di output (il numero di possibili output) è inferiore allo spazio di input. Per capire perché, guardiamo cosa succede. Per prefigurare questo, supponiamo che ci sia una probabilità dello collisione dello 0,001% sha1()molto più basso nella realtà, ma a scopo dimostrativo).

hash1 = sha1(password + salt);

Ora hash1ha una probabilità di collisione dello 0,001%. Ma quando facciamo il prossimo hash2 = sha1(hash1);, tutte le collisioni hash1diventano automaticamente collisioni dihash2 . Quindi ora abbiamo il tasso di hash1 allo 0,001% e la seconda sha1()chiamata si aggiunge a quella. Quindi ora hash2ha una probabilità di collisione dello 0,002%. Sono due volte più possibilità! Ogni iterazione aggiungerà un'altra 0.001%possibilità di collisione al risultato. Quindi, con 1000 iterazioni, la possibilità di collisione è passata da un banale 0,001% all'1%. Ora, il degrado è lineare e le probabilità reali sono molto più piccole, ma l'effetto è lo stesso (una stima della probabilità di una singola collisione md5è di circa 1 / (2 128 ) o 1 / (3x10 38). Anche se sembra piccolo, grazie all'attacco del compleanno non è proprio così piccolo come sembra).

Invece, aggiungendo nuovamente salt e password ogni volta, si reintroducono nuovamente i dati nella funzione hash. Quindi qualsiasi collisione di un round particolare non è più collisione del round successivo. Così:

hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
    hash = sha512(hash + password + salt);
}

Ha le stesse possibilità di collisione della sha512funzione nativa . Qual è quello che vuoi. Usa quello invece.


30
Peccato che i programmatori di LinkedIn non abbiano letto questo prima di aver memorizzato le password come hash SHA1 non salati ... money.cnn.com/2012/06/06/technology/linkedin-password-hack/…
Eric J.

2
@Pacerier: dà anche un po 'di enfasi all'hashish. Va in dettaglio nello specifico
dell'hash delle

1
Non capisco come possa essere una mappatura da 1 a 1 se possono esserci più chiavi con lo stesso risultato. Per DES, la lunghezza della chiave è di 56 bit e le dimensioni del blocco sono 64 bit. Pertanto, non ci sono 256 chiavi diverse che possono essere associate allo stesso blocco di output?
mQQERTY,

1
@ Renren29 sì. Hai ragione. In pratica, l'intera cifra non è né suriettiva né iniettiva. Tuttavia, per una determinata chiave, è suriettivo (ogni testo semplice ha esattamente un testo cifrato) ma non necessariamente iniettivo (non tutti i possibili testi cifrati hanno una mappatura indietro). Ecco perché ho detto che è sempre 1: 1 per una determinata chiave . Se non ci fossero più chiavi che potrebbero essere emesse nello stesso blocco di output, il codice non sarebbe utile poiché il testo cifrato ti direbbe qualcosa sulla chiave (senza saperlo).
Ircmaxell,

7
Bella risposta. Il mio unico pignolo è che il degrado del banale allungamento non può essere lineare o alla fine passerebbe al 100%. Penso che nel tuo esempio con .001% il secondo passo dovrebbe essere .001 + (1 - 0.001) * .001 o 0.001999.
AlexDev,

160

Una funzione di hash potrebbe essere considerata come cuocere una pagnotta di pane. Si inizia con gli input (farina, acqua, lievito, ecc ...) e dopo aver applicato la funzione hash (miscelazione + cottura), si finisce con un output: una pagnotta di pane.

Andare dall'altra parte è straordinariamente difficile - non puoi davvero separare il pane in farina, acqua, lievito - parte di questo è stato perso durante il processo di cottura, e non puoi mai dire esattamente per quanta acqua, farina o lievito sono stati usati una pagnotta particolare, perché quell'informazione è stata distrutta dalla funzione di hashing (ovvero il forno).

Molte diverse varianti di input produrranno teoricamente pagnotte identiche (ad es. 2 tazze d'acqua e 1 tsbp di lievito producono esattamente la stessa pagnotta di 2,1 tazze d'acqua e 0,9tsbp di lievito), ma data una di quelle pagnotte, non si può dire esattamente quale combinazione di input lo ha prodotto.

La crittografia, d'altra parte, potrebbe essere vista come una cassetta di sicurezza. Qualunque cosa tu abbia inserito, ritorna, purché possiedi la chiave con cui è stata rinchiusa in primo luogo. È un'operazione simmetrica. Data una chiave e alcuni input, si ottiene un determinato output. Dato quell'output e la stessa chiave, otterrai l'input originale. È una mappatura 1: 1.


2
Solo che non puoi facilmente dimostrare che un hamburger particolare proviene interamente da una particolare mucca, che è una proprietà fondamentale di un hash, quindi è un'idea divertente ma una terribile analogia.
user467257

1
@caf lol e in effetti un classico. Tuttavia, la mucca non arriva quasi mai sul mercato, è il "toro" che fa ;-) Mucca: latte. Toro: carne.
Funk Forty Niner

1
Questa storia dietro sembra super gustosa.
sitilge il

44

Usa gli hash quando non vuoi essere in grado di recuperare l'input originale, usa la crittografia quando lo fai.

Gli hash prendono un input e lo trasformano in alcuni bit (di solito pensato come un numero, come un numero intero a 32 bit, un numero intero a 64 bit, ecc.). Lo stesso input produrrà sempre lo stesso hash, ma perderai PRINCIPALMENTE le informazioni nel processo in modo da non poter riprodurre in modo affidabile l'input originale (tuttavia ci sono alcuni avvertimenti).

La crittografia conserva principalmente tutte le informazioni inserite nella funzione di crittografia, rende difficile (idealmente impossibile) per chiunque tornare indietro all'input originale senza possedere una chiave specifica.

Semplice esempio di hash

Ecco un esempio banale per aiutarti a capire perché l'hashing (in generale) non può recuperare l'input originale. Supponi che sto creando un hash a 1 bit. La mia funzione hash accetta una stringa di bit come input e imposta l'hash su 1 se nella stringa di input è impostato un numero pari di bit, altrimenti 0 se ci fosse un numero dispari.

Esempio:

Input    Hash
0010     0
0011     1
0110     1
1000     0

Nota che ci sono molti valori di input che portano a un hash di 0 e molti che portano a un hash di 1. Se sai che l'hash è 0, non puoi sapere con certezza quale sia stato l'input originale.

A proposito, questo hash a 1 bit non è esattamente inventato ... dai un'occhiata al bit di parità .

Semplice esempio di crittografia

È possibile crittografare il testo utilizzando una semplice sostituzione di lettere, ad esempio se l'input è A, si scrive B. Se l'input è B, si scrive C. Fino alla fine dell'alfabeto, dove se l'input è Z, si Scrivi di nuovo A.

Input   Encrypted
CAT     DBU
ZOO     APP

Proprio come il semplice esempio di hash, questo tipo di crittografia è stato utilizzato storicamente .


Vale la pena notare che la "crittografia" si riferisce colloquialmente alla crittografia avanzata e non deve essere confusa con una crittografia debole come la cifra di Cesare nell'esempio sopra.
Fax

@Fax Sì, ma ciò che costituisce una crittografia avanzata è stata una barra mobile nel corso dei secoli. La macchina tedesca Enigma della Seconda Guerra Mondiale era quasi impossibile da decifrare (c'è un bel film a riguardo). Oggi, il tuo smartwatch potrebbe facilmente romperlo. Una volta DES era considerato forte, così come MD5. La forte crittografia odierna minaccia di cadere facilmente preda delle tecniche di calcolo quantistico nel prossimo futuro.
Eric J.

Certamente, ed è sempre una buona idea controllare le date dei post e degli articoli che danno consigli sulla crittografia. Detto questo, sono abbastanza sicuro che la cifra di Cesare sia stata considerata debole anche nel 2011.
Fax

39

Panoramica di base sulle tecniche di hashing e crittografia / decrittografia.

hashing:

Se hash qualsiasi testo normale ancora una volta si non si può ottenere lo stesso testo in chiaro dal testo di hash . Semplicemente, è un processo a senso unico.

hashing


Crittografia e decrittografia:

Se si crittografa di nuovo un testo semplice con una chiave, è possibile ottenere lo stesso testo semplice eseguendo la decrittografia su testo crittografato con la stessa chiave (simmetrica) / diversa (asimmetrica).

crittografia e decrittografia


AGGIORNAMENTO: per affrontare i punti menzionati nella domanda modificata.

1. Quando utilizzare hash vs crittografie

L'hashing è utile se si desidera inviare a qualcuno un file. Ma hai paura che qualcun altro possa intercettare il file e modificarlo. Quindi un modo in cui il destinatario può assicurarsi che sia il file giusto è se pubblichi pubblicamente il valore di hash. In questo modo il destinatario può calcolare il valore hash del file ricevuto e verificare che corrisponda al valore hash.

La crittografia è buona se dici di avere un messaggio da inviare a qualcuno. Si crittografa il messaggio con una chiave e il destinatario decodifica con la stessa (o forse anche una chiave diversa) per recuperare il messaggio originale. crediti


2. Ciò che rende un algoritmo di hash o crittografia diverso (da un livello teorico / matematico) cioè ciò che rende irreversibili gli hash (senza l'aiuto di un albero arcobaleno)

Fondamentalmente l' hash è un'operazione che perde informazioni ma non crittografia . Diamo un'occhiata alla differenza in modo matematico semplice per la nostra facile comprensione , ovviamente entrambi hanno un'operazione matematica molto più complicata con le ripetizioni coinvolte in esso

Crittografia / decrittografia (reversibile):

Aggiunta :

4 + 3 = 7  

Questo può essere invertito prendendo la somma e sottraendo uno dei dipendenti

7 - 3 = 4     

Moltiplicazione :

4 * 5 = 20  

Questo può essere invertito prendendo il prodotto e dividendolo per uno dei fattori

20 / 4 = 5    

Quindi, qui potremmo supporre che uno dei componenti aggiuntivi / fattori sia una chiave di decrittazione e il risultato (7,20) sia un testo crittografato.


Hashing (non reversibile):

Divisione Modulo :

22 % 7 = 1   

Questo non può essere annullato perché non è possibile effettuare alcuna operazione al quoziente e al dividendo per ricostituire il divisore (o viceversa).

Riesci a trovare un'operazione da compilare dove il '?' è?

1  ?  7 = 22  
1  ?  22 = 7

Quindi le funzioni hash hanno la stessa qualità matematica della divisione modulo e perdono le informazioni.

crediti


26

La mia unica fodera ... generalmente l'intervistatore voleva la risposta qui sotto.

L'hashing è un modo. Non puoi ottenere la conversione dei tuoi dati / stringa da un codice hash.

La crittografia è a 2 vie: puoi decodificare nuovamente la stringa crittografata se hai la chiave con te.


Hey! Sono due righe.
Mark Storer

17

Una funzione hash trasforma una quantità di testo di dimensioni variabili in un testo di dimensioni fisse.

hash

Fonte: https://en.wikipedia.org/wiki/Hash_function


Funzioni di hash in PHP

Un hash trasforma una stringa in una stringa con hash. Vedi sotto.

HASH:

$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e

Le password vengono generalmente archiviate nella loro rappresentazione con hash invece come testo leggibile. Quando un utente finale desidera accedere a un'applicazione protetta con una password, è necessario fornire una password durante l'autenticazione. Quando l'utente invia la sua password, il sistema di autenticazione valido riceve la password e esegue l'hashing di tale password. Questo hash della password viene confrontato con l'hash conosciuto dal sistema. L'accesso è concesso in caso di uguaglianza.

DEHASH:

SHA1 è un hash unidirezionale. Ciò significa che non è possibile eliminare l'hash.

Tuttavia, puoi forzare la forza dell'hash. Si prega di consultare: https://hashkiller.co.uk/sha1-decrypter.aspx .

MD5, è un altro hash. Un dehasher MD5 è disponibile su questo sito Web: https://www.md5online.org/ .

Per ostacolare gli attacchi di forza bruta sugli hash può essere dato un sale. In php puoi usare password_hash()per creare un hash password. La funzione password_hash()crea automaticamente un sale. Per verificare una password su un hash password (con un salt) utilizzare password_verify().

// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';  
$hash = password_hash($password, PASSWORD_DEFAULT);  

echo $hash; 
// OUTPUT 

$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu 

$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u 

$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW

Una password può essere rappresentata da più di un hash. Quando si verifica la password con hash password diversi utilizzando password_verify(), la password verrà accettata come password valida.

$password = '1234';  

$hash = '$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW';  
var_dump( password_verify($password, $hash) );

// OUTPUT 

boolean true 

boolean true 

boolean true




Una funzione di crittografia trasforma un testo in un testo cifrato senza senso utilizzando una chiave di crittografia e viceversa. inserisci qui la descrizione dell'immagine

Fonte: https://en.wikipedia.org/wiki/Encryption


Crittografia in PHP

Tuffiamoci in qualche codice PHP che gestisce la crittografia.

--- L'estensione Mcrypt ---

ENCRYPT:

$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;

$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);

//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)

DECRYPT:

$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);

//OUTPUT:
string 'My age is 29' (length=12)

--- L'estensione OpenSSL ---

L'estensione Mcrypt è stata deprecata in 7.1. e rimosso in php 7.2. L'estensione OpenSSL dovrebbe essere usata in php 7. Vedi i seguenti frammenti di codice:

$key = 'A_KEY';
$data = 'My age is 29';

// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);

// DECRYPT    
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);

//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)

Si noti che PHP mcrypt è ormai deprecato (potrei aver avuto a che fare con questo) e che SHA-1, MD5 ed ECB sono considerati insicuri. nonA_KEY è una chiave AES / Rijndael-128; è una password, non un ke alleato.
Maarten Bodewes,

@MaartenBodewes Sì, è vero. OpenSSL è la moda ora. php.net/manual/en/book.openssl.php
Julian,

10

Crittografia simmetrica:

La crittografia simmetrica può anche essere definita chiave condivisa o crittografia segreta condivisa. Nella crittografia simmetrica, viene utilizzata una sola chiave per crittografare e decrittografare il traffico.

inserisci qui la descrizione dell'immagine

Crittografia asimmetrica:

La crittografia asimmetrica è anche nota come crittografia a chiave pubblica. La crittografia asimmetrica differisce dalla crittografia simmetrica principalmente in quanto vengono utilizzate due chiavi: una per la crittografia e una per la decrittografia. L'algoritmo di crittografia asimmetrica più comune è RSA.

Rispetto alla crittografia simmetrica, la crittografia asimmetrica impone un onere computazionale elevato e tende a essere molto più lenta. Pertanto, non viene generalmente utilizzato per proteggere i dati del payload. Invece, il suo principale punto di forza è la sua capacità di stabilire un canale sicuro su un supporto non sicuro (ad esempio, Internet). Ciò è possibile mediante lo scambio di chiavi pubbliche, che possono essere utilizzate solo per crittografare i dati. La chiave privata complementare, che non viene mai condivisa, viene utilizzata per la decrittografia.

inserisci qui la descrizione dell'immagine

hashing:

Infine, l'hash è una forma di sicurezza crittografica che differisce dalla crittografia. Considerando che la crittografia è un processo in due fasi utilizzato per crittografare prima e quindi decrittografare un messaggio, l'hash condensa un messaggio in un valore irreversibile a lunghezza fissa o hash. Due degli algoritmi di hashing più comuni visti in rete sono MD5e SHA-1.

inserisci qui la descrizione dell'immagine

Maggiori informazioni qui: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/


Siamo spiacenti, sono un principiante della sicurezza, ma puoi spiegare ulteriormente il significato di "generalmente impiegato per proteggere i dati del payload"?
Abdul,

2
@Abdul La crittografia asimmetrica ha un elevato carico computazionale, quindi non viene utilizzata per proteggere i dati inviati su una rete come pacchetti (payload). Al contrario, viene utilizzato per stabilire una connessione di rete sicura utilizzando lo scambio di chiavi pubbliche per proteggere i dati.
Lucky

5
  1. Usa gli hash quando devi solo andare in una direzione. Ad esempio, per le password in un sistema, si utilizza l'hashing perché si verificherà sempre e solo che il valore immesso da un utente, dopo l'hashing, corrisponde al valore nel proprio repository. Con la crittografia, puoi andare in due modi.

  2. algoritmi di hashing e algoritmi di crittografia sono solo algoritmi matematici. Quindi a tale riguardo non sono diversi: sono solo formule matematiche. Per quanto riguarda la semantica, tuttavia, esiste l'enorme distinzione tra hashing (unidirezionale) e crittografia (bidirezionale). Perché gli hash sono irreversibili? Perché sono progettati per essere così, perché a volte si desidera un'operazione a senso unico.


4

Gli algoritmi di crittografia e hash funzionano in modo simile. In ogni caso, è necessario creare confusione e diffusione tra i bit. In breve, la confusione sta creando una relazione complessa tra la chiave e il testo cifrato e la diffusione sta diffondendo le informazioni di ogni bit.

Molte funzioni hash effettivamente utilizzano algoritmi di cifratura (o primitive di algoritmi di cifratura. Ad esempio, lo SHA-3 candidato Matassa utilizza Threefish come metodo sottostante per elaborare ciascun blocco. La differenza è che invece di mantenere ogni blocco di testo cifrato, sono distruttivamente, deterministicamente uniti insieme ad una lunghezza fissa


4

quando si tratta di sicurezza per la trasmissione di dati, vale a dire la comunicazione bidirezionale si utilizza la crittografia. Tutta la crittografia richiede una chiave

quando si tratta di autorizzazione si usa l'hashing. Non c'è chiave nell'hash

L'hashing prende qualsiasi quantità di dati (binari o di testo) e crea un hash di lunghezza costante che rappresenta un checksum per i dati. Ad esempio, l'hash potrebbe essere di 16 byte. Diversi algoritmi di hashing producono hash di dimensioni diverse. Ovviamente non è possibile ricreare i dati originali dall'hash, ma è possibile eseguire nuovamente l'hash dei dati per vedere se viene generato lo stesso valore di hash. Le password unidirezionali basate su Unix funzionano in questo modo. La password viene memorizzata come valore hash e per accedere a un sistema, la password digitata viene hash e il valore hash viene confrontato con l'hash della password reale. Se corrispondono, devi aver digitato la password corretta

perché l'hash è irreversibile:

L'hash non è reversibile perché la mappatura input-to-hash non è 1-a-1. Avere due input mappati allo stesso valore di hash viene di solito definito "collisione di hash". Per motivi di sicurezza, una delle proprietà di una "buona" funzione hash è che le collisioni sono rare nell'uso pratico.


1
"L'hashing non è reversibile perché la mappatura input-hash non è 1-a-1", grazie, penso che sia un fattore molto importante quando si tratta di differenziare gli hash dalle crittografie! :)
Kenny Cason,

Ciò non distingue chiaramente tra le normali funzioni hash, le funzioni crittografiche di hash e gli hash delle password. Tutti hanno proprietà diverse.
Maarten Bodewes,

-2

La crittografia si occupa di numeri e stringhe. Fondamentalmente ogni cosa digitale nell'intero universo sono numeri. Quando dico numeri, sono 0 e 1. Sai cosa sono, binari. Le immagini che vedi sullo schermo, la musica che ascolti attraverso l'auricolare, tutto è binario. Ma le nostre orecchie e i nostri occhi non capiranno i binari giusto? Solo il cervello può capirlo, e anche se capisce i binari, non può godere dei binari. Quindi convertiamo i binari in formati comprensibili all'uomo come mp3, jpg, ecc. Definiamo il processo come codifica . È un processo a due vie e può essere facilmente decodificato nella sua forma originale.

hashing

L'hashing è un'altra tecnica di crittografia in cui i dati una volta convertiti in un'altra forma non possono più essere recuperati. In termini di Layman, non esiste un processo chiamato de-hashing . Esistono molte funzioni hash per eseguire il lavoro come sha-512, md5 e così via.

Se il valore originale non può essere recuperato, dove lo utilizziamo? Le password! Quando imposti una password per il tuo cellulare o PC, un hash della tua password viene creato e archiviato in un luogo sicuro. La prossima volta che si effettua un tentativo di accesso, la stringa immessa viene nuovamente sottoposta a hash con lo stesso algoritmo (funzione hash) e l'output viene abbinato al valore memorizzato. Se è lo stesso, si effettua l'accesso. Altrimenti si viene espulsi.

Riconoscimenti: wikimedia Applicando l'hash alla password, possiamo garantire che un utente malintenzionato non otterrà mai la nostra password anche se ruba il file di password memorizzato. L'attaccante avrà l'hash della password. Probabilmente può trovare un elenco delle password più comunemente usate e applicare sha-512 a ciascuna di esse e confrontarlo con il valore in mano. Si chiama attacco del dizionario . Ma per quanto tempo lo farebbe? Se la tua password è abbastanza casuale, pensi che questo metodo di cracking funzionerebbe? Tutte le password nei database di Facebook, Google e Amazon sono sottoposte a hash, o almeno dovrebbero essere sottoposte a hash.

Quindi c'è la crittografia

La crittografia si trova tra hashing e codifica. La codifica è un processo a due vie e non deve essere utilizzata per fornire sicurezza. Anche la crittografia è un processo a due vie, ma i dati originali possono essere recuperati se e solo se la chiave di crittografia è nota. Se non sai come funziona la crittografia, non ti preoccupare, discuteremo le basi qui. Sarebbe sufficiente per comprendere le basi di SSL. Esistono quindi due tipi di crittografia, ovvero la crittografia simmetrica e asimmetrica.

Crittografia chiave simmetrica

Sto cercando di mantenere le cose il più semplice possibile. Quindi, comprendiamo la crittografia simmetrica mediante un algoritmo di spostamento. Questo algoritmo viene utilizzato per crittografare gli alfabeti spostando le lettere a sinistra o a destra. Prendiamo una stringa CRYPTO e consideriamo un numero +3. Quindi, il formato crittografato di CRYPTO sarà FUBSWR. Ciò significa che ogni lettera viene spostata a destra di 3 posizioni. Qui, la parola CRYPTO è chiamata Plaintext , l'output FUBSWR è chiamato Ciphertext , il valore +3 è chiamato chiave di crittografia (chiave simmetrica) e l'intero processo è un codice. Questo è uno dei più antichi e basilari algoritmi di crittografia a chiave simmetrica e il suo primo utilizzo è stato segnalato durante il periodo di Giulio Cesare. Quindi, è stato chiamato dopo di lui ed è il famoso Caesar Cipher . Chiunque conosca la chiave di crittografia e può applicare il contrario dell'algoritmo di Cesare e recuperare il testo in chiaro originale. Quindi si chiama Crittografia simmetrica .

Crittografia chiave asimmetrica

Sappiamo che, nella crittografia simmetrica, la stessa chiave viene utilizzata sia per la crittografia che per la decrittografia. Una volta rubata quella chiave, tutti i dati scompaiono. È un rischio enorme e abbiamo bisogno di una tecnica più complessa. Nel 1976, Whitfield Diffie e Martin Hellman pubblicarono per la prima volta il concetto di crittografia asimmetrica e l'algoritmo era noto come scambio di chiavi Diffie-Hellman . Quindi, nel 1978, Ron Rivest, Adi Shamir e Leonard Adleman del MIT pubblicarono l' algoritmo RSA . Questi possono essere considerati il ​​fondamento della crittografia asimmetrica.

Rispetto alla crittografia simmetrica, nella crittografia asimmetrica ci saranno due chiavi invece di una. Uno è chiamato chiave pubblica e l'altro è la chiave privata . Teoricamente, durante l'iniziazione possiamo generare il Pubblico-Privatocoppia di chiavi per la nostra macchina. La chiave privata deve essere conservata in un luogo sicuro e non deve mai essere condivisa con nessuno. La chiave pubblica, come indica il nome, può essere condivisa con chiunque desideri inviarti testo crittografato. Ora, coloro che hanno la tua chiave pubblica possono crittografare i dati segreti con essa. Se la coppia di chiavi è stata generata utilizzando l'algoritmo RSA, dovrebbero utilizzare lo stesso algoritmo durante la crittografia dei dati. Di solito l'algoritmo verrà specificato nella chiave pubblica. I dati crittografati possono essere decrittografati solo con la chiave privata di proprietà dell'utente.

Fonte: SSL / TLS per i manichini parte 1: Ciphersuite, Hashing, Crittografia | WST ( https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/ )


-3

Crittografia Lo scopo della crittografia è quello di trasformare i dati al fine di mantenerli segreti, ad es. (Inviare a qualcuno un testo segreto che solo loro dovrebbero essere in grado di leggere, inviando password tramite Internet).

Invece di focalizzare l'usabilità, l'obiettivo è garantire che l'invio dei dati possa essere inviato segretamente e che possa essere visto solo dall'utente che hai inviato.

Crittografa i dati in un altro formato trasformandolo in un modello univoco che può essere crittografato con la chiave segreta e quegli utenti che dispongono della chiave segreta possono vedere il messaggio invertendo il processo. Ad esempio (AES, Blowfish, RSA)

La crittografia può semplicemente apparire come questa FhQp6U4N28GITVGjdt37hZN

Hashing Tecnicamente possiamo dire che richiede un input arbitrario e produce una stringa di lunghezza fissa.

La cosa più importante in questi è che non puoi passare dall'output all'input, poiché produce un output forte che le informazioni fornite non sono state modificate. Il processo consiste nel prendere un input e l'hash e quindi inviarlo con la chiave privata del mittente una volta ricevuto il destinatario, possono convalidarlo con la chiave pubblica del mittente.

Se l'hash è sbagliato e non coincide con l'hash non possiamo vedere nessuna delle informazioni. Ad esempio (MD5, SHA .....)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.