English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Questo documento introduce l'implementazione di algoritmi di crittografia comuni in Java - l'algoritmo di crittografia a senso unico MD5 e SHA, come segue:
1. Architettura di sicurezza Java
Introduzione all'architettura di sicurezza Java 1.1
In Java, ci sono classi e interfacce per fornire la struttura di sicurezza. L'API di sicurezza JDK è un'API fondamentale del linguaggio di programmazione Java, situata nel pacchetto java.security (e i suoi sottopacchetti), nonché nel pacchetto sun.securityAPI (e i suoi sottopacchetti). È progettato per aiutare i sviluppatori a utilizzare contemporaneamente funzionalità di sicurezza a basso e alto livello nei loro programmi.
La prima versione del JDK Security pubblicata in JDK 1.1 ha introdotto l'architettura di crittografia Java (JCA), che si riferisce alla struttura di architettura utilizzata per accedere e sviluppare le funzionalità di crittografia della piattaforma Java. In JDK 1.1, JCA include API per la firma digitale e l'abstractazione dei messaggi. JDK 1.2 ha esteso significativamente l'architettura di crittografia Java, e ha anche aggiornato l'infrastruttura di gestione dei certificati per supportare i certificati X.509 v3, introducendo una nuova architettura di sicurezza Java per un accesso dettagliato, configurabile, flessibile e scalabile.
L'architettura di crittografia Java include la parte relativa alla crittografia dell'API di sicurezza JDK 1.2, nonché un insieme di convenzioni e specifiche fornite in questo documento. Per realizzare crittografia multipla e interoperabile, fornisce anche un'architettura di provider.
L'estensione Java per la crittografia (JCE) estende l'API JCA, inclusi gli API per la crittografia, lo scambio di chiavi e l'autenticazione di messaggi (MAC). JCE e JDK Crypto forniscono un'API completa per la crittografia indipendente dalla piattaforma. JCE, come estensione di JDK, verrà distribuito separatamente per conformarsi alle restrizioni di esportazione statunitensi.
1.2 Associare il codice sorgente di JDK in Eclipse
Per comprendere meglio l'implementazione degli algoritmi di crittografia a senso unico MD5 e SHA in Java, è possibile associare il codice sorgente di JDK all'Eclipse IDE (l'autore utilizza JDK6.0).
Dopo l'installazione di JDK6.0, c'è una directory src.zip nel directory root di JDK (ad esempio, C:\Java\jdk1.6.0_21). Puoi decomprimere questa directory in un'altra directory (ad esempio, D:\amigo\study\技术随笔\201405). La directory src.zip non contiene tutti i codici sorgente di JDK, ad esempio, i pacchetti sottostanti sun non esistono nella src.zip (ad esempio, il pacchetto sun.security utilizzato in questo articolo e i suoi pacchetti sottostanti non ci sono).
Per scaricare questi pacchetti, è necessario scaricare il codice sorgente di OpenJDK, openjdk è la versione di codice sorgente aperto di JDK, rilasciata sotto la forma di licenza GPL. Durante JDK7, openjdk è diventato il nucleo principale dello sviluppo di JDK7, sun jdk7 è stato pubblicato sulla base di openjdk7, la maggior parte del codice sorgente è la stessa, solo una piccola parte del codice sorgente è stata sostituita. Pubblicato con JRL (JavaResearch License, licenza di ricerca Java).
L'indirizzo di download di OpenJDK: https://it.oldtoolbag.com/softs/75724.html
Dopo il download, copia tutti i file e le cartelle presenti nella directory decompressa openjdk-6-src-b27-26_oct_2012\jdk\src\share\classes nel percorso src decompresso in precedenza.
Successivamente, configura la sorgente associata in Eclipse: fai clic su "Windows" -> "Preferences", seleziona "Java" -> "Installed JREs" nella barra laterale sinistra. Se il JRE è già configurato sul computer, non è necessario configurarlo. Se non è configurato, fai clic sul pulsante "Add" di destra, nella finestra di dialogo "Add JRE" seleziona il percorso dell'installazione del JDK6.0 (ad esempio, C:\Java\jdk1.6.0_21). Fai clic sul pulsante "OK" per completare la configurazione del JRE.
Seleziona il JRE configurato, fai clic sul pulsante "Edit…" di destra, seleziona il pacchetto rt.jar nella finestra di dialogo弹出窗口, poi fai clic sul pulsante "Source Attachment…", nella finestra che si apre clicca su "External Folder…", e indirizza il percorso della sorgente al percorso src (ad esempio, D:\amigo\study\技术随笔\201405). Vedi l'immagine di seguito:
Dopo aver cliccato il pulsante "OK" per completare la configurazione, durante la scrittura dell'implementazione di MD5 e SHA, è possibile utilizzare la modalità di debug F5 per eseguire il debug passo-passo per visualizzare le classi principali coinvolte nell'implementazione dell'algoritmo di crittografia unidirezionale MD5 e SHA in Java.
1.3 Le principali classi di crittografia MD5 e SHA nella JDK
Nella JDK 6.0, le classi strettamente correlate a MD5 e SHA sono illustrate di seguito:
Dove "MessageDigestSpi" è la classe astratta di livello superiore, "MessageDigest" e "DigestBase" nella stessa pacchetto sono sottoclassi astratti.
Nella figura della classe sopra, è stato utilizzato il modello di progettazione Delegate (delegato). Il principio di questo modello è che le classi B (in questo caso, la classe interna Delegage) e A (in questo caso, la classe MessageDigestSpi) sono due classi che non hanno alcun rapporto tra loro, B ha metodi e attributi identici a quelli di A; e chiamare i metodi e gli attributi di B è chiamare i metodi e gli attributi di A con lo stesso nome. B sembra essere un intermediario autorizzato da A. Il codice di terze parti non deve conoscere l'esistenza di A e dei suoi sottoclassi, né avere contatti diretti con A e i suoi sottoclassi, ma può utilizzare direttamente le funzionalità di A attraverso B, così da poter utilizzare tutte le funzionalità di A e proteggere bene A e i suoi sottoclassi.
Il codice relativo a MD5 e SHA si trova nelle classi MD5 e SHA, ma l'astrazione MessageDigest non ha bisogno di interagire con le classi di implementazione individuali, ma solo attraverso le classi deleganti.
2, Crittografia MD5
2.1 Panoramica
L'algoritmo di digestione dei messaggi MD5 (noto in cinese come 'algoritmo di digestione dei messaggi versione 5') è un funzione di hash ampiamente utilizzata nel campo della sicurezza informatica, utilizzata per fornire protezione dell'integrità dei messaggi. Il numero di file dell'algoritmo è RFC 1321 (R.Rivest, MIT Laboratory for Computer Science and RSA Data Security Inc., aprile 1992).
Il nome completo di MD5 è Message-Digest Algorithm 5 (algoritmo di digestione dell'informazione), sviluppato alla fine degli anni '90 dal MIT Laboratory for Computer Science e da Ronald L. Rivest della RSA Data Security Inc., e deriva da MD2, MD3 e MD4.
L'MD5 viene utilizzato per garantire l'integrità e l'uniformità delle informazioni trasmesse. È uno degli algoritmi di hash più utilizzati nei computer (noto anche come algoritmo di riassunto o algoritmo di hash), la maggior parte dei linguaggi di programmazione mainstream ha già implementato l'MD5. Convertire i dati (ad esempio, i caratteri cinesi) in un valore di lunghezza fissa è il principio di base degli algoritmi di hash, i predecessori dell'MD5 sono MD2, MD3 e MD4.
L'obiettivo dell'MD5 è "comprimere" le informazioni a grande capacità in un formato segreto (cioè trasformare una stringa di byte di lunghezza arbitraria in una stringa di numeri esadecimali di lunghezza fissa) prima di essere firmate digitalmente con software di firma digitale di chiave privata.
2.2 Principio dell'algoritmo
Una descrizione breve dell'algoritmo MD5 può essere: MD5 elabora le informazioni in gruppi di 512 bit, e ogni gruppo viene diviso in 16 sottogruppi di 32 bit, dopo una serie di elaborazioni, l'output dell'algoritmo è composto da quattro gruppi di 32 bit, concatenando questi quattro gruppi di 32 bit si genererà un valore di hash di 128 bit.
Nell'algoritmo MD5, inizialmente è necessario riempire le informazioni, in modo che la lunghezza in bit dell'informazione, quando divisa per 512, lasci un residuo di 448. Pertanto, la lunghezza in bit (Bits Length) dell'informazione sarà estesa a N*512+448, dove N è un intero non negativo, N può essere zero. Il metodo di riempimento è il seguente: aggiungere dietro le informazioni un 1 e un numero infinito di 0 fino a soddisfare le condizioni sopra indicate, dopodiché fermarsi con gli 0 per riempire le informazioni. Poi aggiungere dietro questo risultato la lunghezza in bit dell'informazione prima del riempimento, espressa in 64 bit binari. Dopo questi due passaggi di elaborazione, la lunghezza in bit dell'informazione è N*512+448+64=(N+1)*512, ossia la lunghezza è esattamente un multiplo di 512. Questo viene fatto per soddisfare le richieste di lunghezza dell'informazione per il successivo elaborazione.
2.3 Implementazione MD5 in Java
L'esecuzione in Java dell'algoritmo MD5 è illustrata di seguito:
package amigo.endecrypt; import java.security.MessageDigest; /** * Utilizza la crittografia MD5 * @author Xingxing,Xie * @datetime 2014-5-31 */ public class MD5Util { /*** * MD5 criptografia Genera un codice md5 di 32 bit * @param Stringa da crittografare * @return Restituisce un codice md5 di 32 bit */ public static String md5Encode(String inStr) throws Exception { MessageDigest md5 = null; try { md5 = MessageDigest.getInstance("MD5"); } catch (Exception e) { System.out.println(e.toString()); e.printStackTrace(); return ""; } byte[] byteArray = inStr.getBytes("UTF-8"); byte[] md5Bytes = md5.digest(byteArray); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) { hexValue.append("0"); } hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); } /** * 测试主函数 * @param args * @throws Exception */ public static void main(String args[]) throws Exception { String str = new String("amigoxiexiexingxing"); System.out.println("Originale: " + str); System.out.println("MD5后:" + md5Encode(str)); } }
测试结果:
Originale: amigoxiexiexingxing
MD5后:e9ac094091b96b84cca48098bc21b1d6
3, Crittografia SHA
3.1 Panoramica
SHA è un algoritmo di crittografia dei dati, dopo anni di sviluppo e miglioramento degli esperti di crittografia, è diventato uno degli algoritmi di hash più sicuri riconosciuti e ampiamente utilizzati. L'idea dell'algoritmo è ricevere un segmento di testo chiaro e trasformarlo in modo irreversibile in un segmento di testo criptato (solitamente più piccolo), può anche essere semplicemente inteso come prendere una sequenza di codici di input (chiamati pre-mappatura o informazione) e trasformarli in una sequenza di output di lunghezza più breve e numero fisso, ovvero il valore di hash (noto anche come riassunto dell'informazione o codice di autenticazione dell'informazione). Il valore del funzione di hash può essere considerato una sorta di 'impronta digitale' o 'riassunto' del testo chiaro, quindi la firma digitale del valore di hash può essere considerata una firma digitale del testo chiaro.
L'algoritmo di hash sicuro SHA (Secure Hash Algorithm, SHA) è uno standard nazionale pubblicato dal National Institute of Standards and Technology degli Stati Uniti, FIPS PUB 180, lo standard più recente è stato aggiornato a FIPS PUB 180-3 nel 2008. In cui sono specificati gli algoritmi di hash unidirezionali SHA-1, SHA-224, SHA-256, SHA-384 e SHA-512. SHA-1, SHA-224 e SHA-256 sono adatti ai messaggi di lunghezza non superiore a 2^64 bit binari. SHA-384 e SHA-512 sono adatti ai messaggi di lunghezza non superiore a 2^128 bit binari.
3.2 Principio
SHA-1 è un algoritmo di crittografia dei dati, l'idea dell'algoritmo è ricevere un segmento di testo chiaro e trasformarlo in modo irreversibile in un segmento di testo criptato (solitamente più piccolo), può anche essere semplicemente inteso come prendere una sequenza di codici di input (chiamati pre-mappatura o informazione) e trasformarli in una sequenza di output di lunghezza più breve e numero fisso, ovvero il valore di hash (noto anche come riassunto dell'informazione o codice di autenticazione dell'informazione).
La sicurezza dell'algoritmo di hash unidirezionale risiede nel fatto che l'operazione di generazione del valore di hash ha una forte unidirezionalità. Se si inserisce una password nella sequenza di input, nessuno può generare il valore di hash corretto senza conoscere la password, garantendo così la sicurezza. SHA divide il flusso di input in blocchi di 512 bit (64 byte) e genera un output di 20 byte chiamato codice di autenticazione dell'informazione o riassunto dell'informazione.
L'algoritmo non limita la lunghezza del messaggio di input, il risultato della generazione è un riassunto del messaggio di 160 bit. L'input viene trattato in gruppi di 512 bit (64 byte). SHA-1 è irreversibile, anti-collisione e ha un eccellente effetto di cascata.
Il digital signature può essere realizzato attraverso l'algoritmo di hash, il principio del digital signature è trasformare il testo chiaro da trasmettere attraverso un'operazione di funzione (Hash) in un riassunto del messaggio (diversi testi chiari corrispondono a diversi riassunti del messaggio), il riassunto del messaggio crittografato viene trasmesso insieme al testo chiaro al destinatario, il destinatario genera un nuovo riassunto del messaggio basato sul testo chiaro ricevuto e confronta con il riassunto del messaggio inviato dal mittente, se il risultato del confronto è coerente significa che il testo chiaro non è stato modificato, se non è coerente significa che il testo chiaro è stato alterato.
MAC (Message Authentication Code) è un risultato di hash, parte delle informazioni di input è la password, solo i partecipanti che sanno questa password possono calcolare e verificare nuovamente la legittimità del codice MAC.
3.3 Implementazione di SHA in Java
L'esecuzione di SHA in Java è simile a MD5, vedere il codice di seguito:
package amigo.endecrypt; import java.security.MessageDigest; /** * Utilizza SHAA加密 * @author Xingxing,Xie * @datetime 2014-6-1 */ public class SHAUtil { /*** * Crittografia SHA per generare un codice SHA di 40 caratteri * @param Stringa da crittografare * @return Restituisce un codice SHA di 40 caratteri */ public static String shaEncode(String inStr) throws Exception { MessageDigest sha = null; try { sha = MessageDigest.getInstance("SHA"); } catch (Exception e) { System.out.println(e.toString()); e.printStackTrace(); return ""; } byte[] byteArray = inStr.getBytes("UTF-8"); byte[] md5Bytes = sha.digest(byteArray); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) { hexValue.append("0"); } hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); } /** * 测试主函数 * @param args * @throws Exception */ public static void main(String args[]) throws Exception { String str = new String("amigoxiexiexingxing"); System.out.println("Originale: " + str); System.out.println("SHA dopo: " + shaEncode(str)); } }
I risultati del test sono mostrati di seguito:
Originale: amigoxiexiexingxing
SHA dopo: 04f79f496dd6bdab3439511606528a4ad9caac5e
3. Confronto tra SHA-1 e MD5
Poiché entrambi derivano da MD4, SHA-1 e MD5 sono molto simili tra loro. Di conseguenza, la loro forza e altre caratteristiche sono simili, ma ci sono anche alcune differenze:
1) Sicurezza degli attacchi forzati: la differenza più significativa e importante è che l'摘要 di SHA-1 è più lungo di 32 bit rispetto all'摘要 di MD5. Utilizzando tecniche forzate, la difficoltà di generare un messaggio qualsiasi con un'摘要 uguale a un摘要 dato è dell'ordine di 2^128 per MD5, mentre per SHA-1 è dell'ordine di 2^160. Pertanto, SHA-1 ha una maggiore robustezza contro gli attacchi forzati.
2) Sicurezza dell'analisi delle password: a causa del design di MD5, è soggetta a attacchi di analisi delle password, mentre SHA-1 sembra essere meno suscettibile a tali attacchi.
3) Velocità: sulla stessa hardware, la velocità di esecuzione di SHA-1 è più lenta rispetto a MD5.
Questo è tutto il contenuto dell'articolo, spero che sia utile per la tua apprendimento e che tu sostenga fortemente la guida di urla.
Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, il copyright è proprietà del rispettivo autore, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, invia un'email a notice#oldtoolbag.com (sostituisci # con @) per segnalare il problema, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.