|
|
| Zeile 75: |
Zeile 75: |
| | </pre> | | </pre> |
| | Einige Beispielcodes, um eine Visualisierung dessen zu erhalten, was im Hintergrund passiert: | | Einige Beispielcodes, um eine Visualisierung dessen zu erhalten, was im Hintergrund passiert: |
| − | <pre>
| |
| − | #! /usr/bin/env python
| |
| − |
| |
| − | import hmac,hashlib,binascii,sha
| |
| − | from pbkdf2 import PBKDF2
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | Sobald das zweite Paket des Handshakes erfasst wurde, verfügt ein Angreifer über genügend Informationen, um zu versuchen, den Pairwise-Transient-Key zu berechnen (unter Verwendung einer angenommenen PSK-Passphrase), der dann verwendet werden kann, um den Key-Confirmation-Key zu extrahieren und die Nachricht zu berechnen compute Integritätscode. Es ist dieser MIC, der beim Vergleich mit dem echten MIC verwendet wird, um die Gültigkeit der angenommenen PSK zu bestimmen.
| |
| − |
| |
| − | Dieser ganze Prozess wird fDer einzige Hinweis auf eine verwendbare PRF512-Funktion in Python war ein Codeauszug aus einer Frage zu Stack Overflow aus dem Jahr 2012:
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − | PythonKopieren
| |
| − | Einige Beispielcodes, um eine Visualisierung dessen zu erhalten, was im Hintergrund passiert:
| |
| − |
| |
| − | #! /usr/bin/env python
| |
| − |
| |
| − | import hmac,hashlib,binascii,sha
| |
| − | from pbkdf2 import PBKDF2
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − |
| |
| − | ssid = raw_input('SSID: ')
| |
| − | passphrase = raw_input('Passphrase: ')
| |
| − | ap_mac = binascii.a2b_hex(raw_input("AP MAC: "))
| |
| − | s_mac = binascii.a2b_hex(raw_input("Client MAC: "))
| |
| − | anonce = binascii.a2b_hex(raw_input("ANonce: "))
| |
| − | snonce = binascii.a2b_hex(raw_input("SNonce: "))
| |
| − |
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − | pke = "Pairwise key expansion"
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − |
| |
| − | pmk = PBKDF2(passphrase, ssid, 4096).read(32)
| |
| − | ptk = customPRF512(pmk,pke,key_data).encode('hex')
| |
| − |
| |
| − | print ("\nPMKey: " + pmk)
| |
| − | print ("PTKey: " + ptk)
| |
| − | print ("KCK: " + ptk[0:16])
| |
| − | PythonKopieren
| |
| − | Der PMK und der PTK werden dann an das Terminal gedruckt, wobei die ersten 16 Bytes des PTK der KCK sind.
| |
| − |
| |
| − | Was wird eigentlich für das Knacken berechnet?
| |
| − | Sobald das zweite Paket des Handshakes erfasst wurde, verfügt ein Angreifer über genügend Informationen, um zu versuchen, den Pairwise-Transient-Key zu berechnen (unter Verwendung einer angenommenen PSK-Passphrase), der dann verwendet werden kann, um den Key-Confirmation-Key zu extrahieren und die Nachricht zu berechnen compute Integritätscode. Es ist dieser MIC, der beim Vergleich mit dem echten MIC verwendet wird, um die Gültigkeit der angenommenen PSK zu bestimmen.
| |
| − |
| |
| − | Dieser ganze Prozess wird für jeden Wörterbucheintrag (oder Brute-Force-Versuch) während des Passwortknackens erneut ausgeführt, was der Grund für die langsame Leistung von Hashcat, Cowpatty und John The Ripper ist (obwohl ich immer noch 100.000 Hashes P/s verwalte). mit Oclhashcat, was zeigt, wie fantastisch der Code von Atom optimiert ist).
| |
| − |
| |
| − | Der MIC wird unter Verwendung von HMAC_MD5 berechnet, das seine Eingabe vom KCK-Schlüssel innerhalb des PTK erhält. Leider war ich nicht in der Lage, Python-Code zur Berechnung des MIC zu finden, selbst nachdem ich den Quellcode von Aircrack-ng und Cowpatty überprüft hatte (meine C-Kenntnisse fehlen stark). Erweitere das oben Gesagte und lass es mich wissen, wenn jemand eine Idee hat!
| |
| − |
| |
| − | Schlussfolgerungen
| |
| − | Wenn ich den Rechenaufwand für jeden Versuch des Vergleichs der MICs kenne, beruhigt mich die Sicherheit der Verwendung von PSK-Authentifizierung in persönlichen Netzwerken etwas, aber es beweist, wie unschätzbar zufällige Passphrasen in verschiedenen kryptografischen Implementierungen wie dieser sind , insbesondere Passphrasen, die länger sind und mehr Entropie enthalten. Verwenden Sie für Ihr PSK eine Passphrase mit 15 Zeichen, die eine Kombination aus Groß- und Kleinbuchstaben, numerischen und Sonderzeichen enthält, die kein Wörterbuchwort sind . Oh, und ändern Sie es auch regelmäßig. Wenn ich oder jemand anderes Ihre Passphrase knacken würde, würde ein Angreifer nicht viel davon gebrauchen können. Wenn er in einem Monat dorthin zurückkehrt, kann keine Verbindung hergestellt werden, da er auf einen neuen Wert geändert wurde.
| |
| − |
| |
| − | Noch wichtiger ist, dass Sie für Ihre Unternehmensnetzwerke keine PSK-Authentifizierung verwenden. Es gibt zwar einige Schwachstellen in bestimmten EAP-Konfigurationen, diese sind jedoch viel einfacher zu beseitigen als ein Offline-Angriff, wie er gegen PSKs in der Lage ist.
| |
| − |
| |
| − | Wenn eine der oben genannten Informationen falsch ist, senden Sie mir bitte eine E-Mail und ich werde die erforderlichen Änderungen vornehmen und entsprechend gutschreiben.
| |
| − |
| |
| − | Verweise
| |
| − | Ich habe einige externe Quellen verwendet, um diese Prozesse weiter zu verstehen. Sie sind in keiner bestimmten Reihenfolge:
| |
| − |
| |
| − | https://en.wikipedia.org/wiki/IEEE_802.11i-2004
| |
| − | http://tools.ietf.org/html/rfc2104
| |
| − | http://www.tldp.org/HOWTO/8021X-HOWTO/intro.htmlDer einzige Hinweis auf eine verwendbare PRF512-Funktion in Python war ein Codeauszug aus einer Frage zu Stack Overflow aus dem Jahr 2012:
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − | PythonKopieren
| |
| − | Einige Beispielcodes, um eine Visualisierung dessen zu erhalten, was im Hintergrund passiert:
| |
| − |
| |
| − | #! /usr/bin/env python
| |
| − |
| |
| − | import hmac,hashlib,binascii,sha
| |
| − | from pbkdf2 import PBKDF2
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − |
| |
| − | ssid = raw_input('SSID: ')
| |
| − | passphrase = raw_input('Passphrase: ')
| |
| − | ap_mac = binascii.a2b_hex(raw_input("AP MAC: "))
| |
| − | s_mac = binascii.a2b_hex(raw_input("Client MAC: "))
| |
| − | anonce = binascii.a2b_hex(raw_input("ANonce: "))
| |
| − | snonce = binascii.a2b_hex(raw_input("SNonce: "))
| |
| − |
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − | pke = "Pairwise key expansion"
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − |
| |
| − | pmk = PBKDF2(passphrase, ssid, 4096).read(32)
| |
| − | ptk = customPRF512(pmk,pke,key_data).encode('hex')
| |
| − |
| |
| − | print ("\nPMKey: " + pmk)
| |
| − | print ("PTKey: " + ptk)
| |
| − | print ("KCK: " + ptk[0:16])
| |
| − | PythonKopieren
| |
| − | Der PMK und der PTK werden dann an das Terminal gedruckt, wobei die ersten 16 Bytes des PTK der KCK sind.
| |
| − |
| |
| − | Was wird eigentlich für das Knacken berechnet?
| |
| − | Sobald das zweite Paket des Handshakes erfasst wurde, verfügt ein Angreifer über genügend Informationen, um zu versuchen, den Pairwise-Transient-Key zu berechnen (unter Verwendung einer angenommenen PSK-Passphrase), der dann verwendet werden kann, um den Key-Confirmation-Key zu extrahieren und die Nachricht zu berechnen compute Integritätscode. Es ist dieser MIC, der beim Vergleich mit dem echten MIC verwendet wird, um die Gültigkeit der angenommenen PSK zu bestimmen.
| |
| − |
| |
| − | Dieser ganze Prozess wird für jeden Wörterbucheintrag (oder Brute-Force-Versuch) während des Passwortknackens erneut ausgeführt, was der Grund für die langsame Leistung von Hashcat, Cowpatty und John The Ripper ist (obwohl ich immer noch 100.000 Hashes P/s verwalte). mit Oclhashcat, was zeigt, wie fantastisch der Code von Atom optimiert ist).
| |
| − |
| |
| − | Der MIC wird unter Verwendung von HMAC_MD5 berechnet, das seine Eingabe vom KCK-Schlüssel innerhalb des PTK erhält. Leider war ich nicht in der Lage, Python-Code zur Berechnung des MIC zu finden, selbst nachdem ich den Quellcode von Aircrack-ng und Cowpatty überprüft hatte (meine C-Kenntnisse fehlen stark). Erweitere das oben Gesagte und lass es mich wissen, wenn jemand eine Idee hat!
| |
| − |
| |
| − | Schlussfolgerungen
| |
| − | Wenn ich den Rechenaufwand für jeden Versuch des Vergleichs der MICs kenne, beruhigt mich die Sicherheit der Verwendung von PSK-Authentifizierung in persönlichen Netzwerken etwas, aber es beweist, wie unschätzbar zufällige Passphrasen in verschiedenen kryptografischen Implementierungen wie dieser sind , insbesondere Passphrasen, die länger sind und mehr Entropie enthalten. Verwenden Sie für Ihr PSK eine Passphrase mit 15 Zeichen, die eine Kombination aus Groß- und Kleinbuchstaben, numerischen und Sonderzeichen enthält, die kein Wörterbuchwort sind . Oh, und ändern Sie es auch regelmäßig. Wenn ich oder jemand anderes Ihre Passphrase knacken würde, würde ein Angreifer nicht viel davon gebrauchen können. Wenn er in einem Monat dorthin zurückkehrt, kann keine Verbindung hergestellt werden, da er auf einen neuen Wert geändert wurde.
| |
| − |
| |
| − | Noch wichtiger ist, dass Sie für Ihre Unternehmensnetzwerke keine PSK-Authentifizierung verwenden. Es gibt zwar einige Schwachstellen in bestimmten EAP-Konfigurationen, diese sind jedoch viel einfacher zu beseitigen als ein Offline-Angriff, wie er gegen PSKs in der Lage ist.
| |
| − |
| |
| − | Wenn eine der oben genannten Informationen falsch ist, senden Sie mir bitte eine E-Mail und ich werde die erforderlichen Änderungen vornehmen und entsprechend gutschreiben.
| |
| − |
| |
| − | Verweise
| |
| − | Ich habe einige externe Quellen verwendet, um diese Prozesse weiter zu verstehen. Sie sind in keiner bestimmten Reihenfolge:
| |
| − |
| |
| − | https://en.wikipedia.org/wiki/IEEE_802.11i-2004
| |
| − | http://tools.ietf.org/html/rfc2104
| |
| − | http://www.tldp.org/HOWTO/8021X-HOWTO/intro.htmlür jeden Wörterbucheintrag (oder Brute-Force-Versuch) während des Passwortknackens erneut ausgeführt, was der Grund für die langsame Leistung von Hashcat, Cowpatty und John The Ripper ist (obwohl ich immer noch 100.000 Hashes P/s verwalte). mit Oclhashcat, was zeigt, wie fantastisch der Code von Atom optimiert ist).
| |
| − |
| |
| − | Der MIC wird unter Verwendung von HMAC_MD5 berechnet, das seine Eingabe vom KCK-Schlüssel innerhalb des PTK erhält. Leider war ich nicht in der Lage, Python-Code zur Berechnung des MIC zu finden, selbst nachdem ich den Quellcode von Aircrack-ng und Cowpatty überprüft hatte (meine C-Kenntnisse fehlen stark). Erweitere das oben Gesagte und lass es mich wissen, wenn jemand eine Idee hat!
| |
| − |
| |
| − | Schlussfolgerungen
| |
| − | Wenn ich den Rechenaufwand für jeden Versuch des Vergleichs der MICs kenne, beruhigt mich die Sicherheit der Verwendung von PSK-Authentifizierung in persönlichen Netzwerken etwas, aber es beweist, wie unschätzbar zufällige Passphrasen in verschiedenen kryptografischen Implementierungen wie dieser sind , insbesondere Passphrasen, die länger sind und mehr Entropie enthalten. Verwenden Sie für Ihr PSK eine Passphrase mit 15 Zeichen, die eine Kombination aus Groß- und Kleinbuchstaben, numerischen und Sonderzeichen enthält, die kein Wörterbuchwort sind . Oh, und ändern Sie es auch regelmäßig. Wenn ich oder jemand anderes Ihre Passphrase knacken würde, würde ein Angreifer nicht viel davon gebrauchen können. Wenn er in einem Monat dorthin zurückkehrt, kann keine Verbindung hergestellt werden, da er auf einen neuen Wert geändert wurde.
| |
| − |
| |
| − | Noch wichtiger ist, dass Sie für Ihre Unternehmensnetzwerke keine PSK-Authentifizierung verwenden. Es gibt zwar einige Schwachstellen in bestimmten EAP-Konfigurationen, diese sind jedoch viel einfacher zu beseitigen als ein Offline-Angriff, wie er gegen PSKs in der Lage ist.
| |
| − |
| |
| − | Wenn eine der oben genannten Informationen falsch ist, senden Sie
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − |
| |
| − | ssid = raw_input('SSID: ')
| |
| − | passphrase = raw_input('Passphrase: ')
| |
| − | ap_mac = binascii.a2b_hex(raw_input("AP MAC: "))
| |
| − | s_mac = binascii.a2b_hex(raw_input("Client MAC: "))
| |
| − | anonce = binascii.a2b_hex(raw_input("ANonce: "))
| |
| − | snonce = binascii.a2b_hex(raw_input("SNonce: "))
| |
| − |
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − | pke = "Pairwise key expansion"
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − |
| |
| − | pmk = PBKDF2(passphrase, ssid, 4096).read(32)
| |
| − | ptk = customPRF512(pmk,pke,key_data).encode('hex')
| |
| − |
| |
| − | print ("\nPMKey: " + pmk)
| |
| − | print ("PTKey: " + ptk)
| |
| − | print ("KCK: " + ptk[0:16])
| |
| − | </pre>
| |
| − |
| |
| − | Der PMK und der PTK werden dann an das Terminal gedruckt, wobei die ersten 16 Bytes des PTK der KCK sind.
| |
| − |
| |
| − | =Was wird eigentlich für das Knacken berechnet?=
| |
| − | Sobald das zweite Paket des Handshakes erfasst wurde, verfügt ein Angreifer über genügend Informationen, um zu versuchen, den Pairwise-Transient-Key zu berechnen (unter Verwendung einer angenommenen PSK-Passphrase), der dann verwendet werden kann, um den Key-Confirmation-Key zu extrahieren und die Nachricht zu berechnen compute Integritätscode. Es ist dieser MIC, der beim Vergleich mit dem echten MIC verwendet wird, um die Gültigkeit der angenommenen PSK zu bestimmen.
| |
| − |
| |
| − | Dieser ganze Prozess wird fDer einzige Hinweis auf eine verwendbare PRF512-Funktion in Python war ein Codeauszug aus einer Frage zu Stack Overflow aus dem Jahr 2012:
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − | PythonKopieren
| |
| − | Einige Beispielcodes, um eine Visualisierung dessen zu erhalten, was im Hintergrund passiert:
| |
| − |
| |
| − | #! /usr/bin/env python
| |
| − |
| |
| − | import hmac,hashlib,binascii,sha
| |
| − | from pbkdf2 import PBKDF2
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − |
| |
| − | ssid = raw_input('SSID: ')
| |
| − | passphrase = raw_input('Passphrase: ')
| |
| − | ap_mac = binascii.a2b_hex(raw_input("AP MAC: "))
| |
| − | s_mac = binascii.a2b_hex(raw_input("Client MAC: "))
| |
| − | anonce = binascii.a2b_hex(raw_input("ANonce: "))
| |
| − | snonce = binascii.a2b_hex(raw_input("SNonce: "))
| |
| − |
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − | pke = "Pairwise key expansion"
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − |
| |
| − | pmk = PBKDF2(passphrase, ssid, 4096).read(32)
| |
| − | ptk = customPRF512(pmk,pke,key_data).encode('hex')
| |
| − |
| |
| − | print ("\nPMKey: " + pmk)
| |
| − | print ("PTKey: " + ptk)
| |
| − | print ("KCK: " + ptk[0:16])
| |
| − | PythonKopieren
| |
| − | Der PMK und der PTK werden dann an das Terminal gedruckt, wobei die ersten 16 Bytes des PTK der KCK sind.
| |
| − |
| |
| − | Was wird eigentlich für das Knacken berechnet?
| |
| − | Sobald das zweite Paket des Handshakes erfasst wurde, verfügt ein Angreifer über genügend Informationen, um zu versuchen, den Pairwise-Transient-Key zu berechnen (unter Verwendung einer angenommenen PSK-Passphrase), der dann verwendet werden kann, um den Key-Confirmation-Key zu extrahieren und die Nachricht zu berechnen compute Integritätscode. Es ist dieser MIC, der beim Vergleich mit dem echten MIC verwendet wird, um die Gültigkeit der angenommenen PSK zu bestimmen.
| |
| − |
| |
| − | Dieser ganze Prozess wird für jeden Wörterbucheintrag (oder Brute-Force-Versuch) während des Passwortknackens erneut ausgeführt, was der Grund für die langsame Leistung von Hashcat, Cowpatty und John The Ripper ist (obwohl ich immer noch 100.000 Hashes P/s verwalte). mit Oclhashcat, was zeigt, wie fantastisch der Code von Atom optimiert ist).
| |
| − |
| |
| − | Der MIC wird unter Verwendung von HMAC_MD5 berechnet, das seine Eingabe vom KCK-Schlüssel innerhalb des PTK erhält. Leider war ich nicht in der Lage, Python-Code zur Berechnung des MIC zu finden, selbst nachdem ich den Quellcode von Aircrack-ng und Cowpatty überprüft hatte (meine C-Kenntnisse fehlen stark). Erweitere das oben Gesagte und lass es mich wissen, wenn jemand eine Idee hat!
| |
| − |
| |
| − | Schlussfolgerungen
| |
| − | Wenn ich den Rechenaufwand für jeden Versuch des Vergleichs der MICs kenne, beruhigt mich die Sicherheit der Verwendung von PSK-Authentifizierung in persönlichen Netzwerken etwas, aber es beweist, wie unschätzbar zufällige Passphrasen in verschiedenen kryptografischen Implementierungen wie dieser sind , insbesondere Passphrasen, die länger sind und mehr Entropie enthalten. Verwenden Sie für Ihr PSK eine Passphrase mit 15 Zeichen, die eine Kombination aus Groß- und Kleinbuchstaben, numerischen und Sonderzeichen enthält, die kein Wörterbuchwort sind . Oh, und ändern Sie es auch regelmäßig. Wenn ich oder jemand anderes Ihre Passphrase knacken würde, würde ein Angreifer nicht viel davon gebrauchen können. Wenn er in einem Monat dorthin zurückkehrt, kann keine Verbindung hergestellt werden, da er auf einen neuen Wert geändert wurde.
| |
| − |
| |
| − | Noch wichtiger ist, dass Sie für Ihre Unternehmensnetzwerke keine PSK-Authentifizierung verwenden. Es gibt zwar einige Schwachstellen in bestimmten EAP-Konfigurationen, diese sind jedoch viel einfacher zu beseitigen als ein Offline-Angriff, wie er gegen PSKs in der Lage ist.
| |
| − |
| |
| − | Wenn eine der oben genannten Informationen falsch ist, senden Sie mir bitte eine E-Mail und ich werde die erforderlichen Änderungen vornehmen und entsprechend gutschreiben.
| |
| − |
| |
| − | Verweise
| |
| − | Ich habe einige externe Quellen verwendet, um diese Prozesse weiter zu verstehen. Sie sind in keiner bestimmten Reihenfolge:
| |
| − |
| |
| − | https://en.wikipedia.org/wiki/IEEE_802.11i-2004
| |
| − | http://tools.ietf.org/html/rfc2104
| |
| − | http://www.tldp.org/HOWTO/8021X-HOWTO/intro.htmlDer einzige Hinweis auf eine verwendbare PRF512-Funktion in Python war ein Codeauszug aus einer Frage zu Stack Overflow aus dem Jahr 2012:
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − | PythonKopieren
| |
| − | Einige Beispielcodes, um eine Visualisierung dessen zu erhalten, was im Hintergrund passiert:
| |
| − |
| |
| − | #! /usr/bin/env python
| |
| − |
| |
| − | import hmac,hashlib,binascii,sha
| |
| − | from pbkdf2 import PBKDF2
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − |
| |
| − | ssid = raw_input('SSID: ')
| |
| − | passphrase = raw_input('Passphrase: ')
| |
| − | ap_mac = binascii.a2b_hex(raw_input("AP MAC: "))
| |
| − | s_mac = binascii.a2b_hex(raw_input("Client MAC: "))
| |
| − | anonce = binascii.a2b_hex(raw_input("ANonce: "))
| |
| − | snonce = binascii.a2b_hex(raw_input("SNonce: "))
| |
| − |
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − | pke = "Pairwise key expansion"
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − |
| |
| − | pmk = PBKDF2(passphrase, ssid, 4096).read(32)
| |
| − | ptk = customPRF512(pmk,pke,key_data).encode('hex')
| |
| − |
| |
| − | print ("\nPMKey: " + pmk)
| |
| − | print ("PTKey: " + ptk)
| |
| − | print ("KCK: " + ptk[0:16])
| |
| − | PythonKopieren
| |
| − | Der PMK und der PTK werden dann an das Terminal gedruckt, wobei die ersten 16 Bytes des PTK der KCK sind.
| |
| − |
| |
| − | Was wird eigentlich für das Knacken berechnet?
| |
| − | Sobald das zweite Paket des Handshakes erfasst wurde, verfügt ein Angreifer über genügend Informationen, um zu versuchen, den Pairwise-Transient-Key zu berechnen (unter Verwendung einer angenommenen PSK-Passphrase), der dann verwendet werden kann, um den Key-Confirmation-Key zu extrahieren und die Nachricht zu berechnen compute Integritätscode. Es ist dieser MIC, der beim Vergleich mit dem echten MIC verwendet wird, um die Gültigkeit der angenommenen PSK zu bestimmen.
| |
| − |
| |
| − | Dieser ganze Prozess wird für jeden Wörterbucheintrag (oder Brute-Force-Versuch) während des Passwortknackens erneut ausgeführt, was der Grund für die langsame Leistung von Hashcat, Cowpatty und John The Ripper ist (obwohl ich immer noch 100.000 Hashes P/s verwalte). mit Oclhashcat, was zeigt, wie fantastisch der Code von Atom optimiert ist).
| |
| − |
| |
| − | Der MIC wird unter Verwendung von HMAC_MD5 berechnet, das seine Eingabe vom KCK-Schlüssel innerhalb des PTK erhält. Leider war ich nicht in der Lage, Python-Code zur Berechnung des MIC zu finden, selbst nachdem ich den Quellcode von Aircrack-ng und Cowpatty überprüft hatte (meine C-Kenntnisse fehlen stark). Erweitere das oben Gesagte und lass es mich wissen, wenn jemand eine Idee hat!
| |
| − |
| |
| − | Schlussfolgerungen
| |
| − | Wenn ich den Rechenaufwand für jeden Versuch des Vergleichs der MICs kenne, beruhigt mich die Sicherheit der Verwendung von PSK-Authentifizierung in persönlichen Netzwerken etwas, aber es beweist, wie unschätzbar zufällige Passphrasen in verschiedenen kryptografischen Implementierungen wie dieser sind , insbesondere Passphrasen, die länger sind und mehr Entropie enthalten. Verwenden Sie für Ihr PSK eine Passphrase mit 15 Zeichen, die eine Kombination aus Groß- und Kleinbuchstaben, numerischen und Sonderzeichen enthält, die kein Wörterbuchwort sind . Oh, und ändern Sie es auch regelmäßig. Wenn ich oder jemand anderes Ihre Passphrase knacken würde, würde ein Angreifer nicht viel davon gebrauchen können. Wenn er in einem Monat dorthin zurückkehrt, kann keine Verbindung hergestellt werden, da er auf einen neuen Wert geändert wurde.
| |
| − |
| |
| − | Noch wichtiger ist, dass Sie für Ihre Unternehmensnetzwerke keine PSK-Authentifizierung verwenden. Es gibt zwar einige Schwachstellen in bestimmten EAP-Konfigurationen, diese sind jedoch viel einfacher zu beseitigen als ein Offline-Angriff, wie er gegen PSKs in der Lage ist.
| |
| − |
| |
| − | Wenn eine der oben genannten Informationen falsch ist, senden Sie mir bitte eine E-Mail und ich werde die erforderlichen Änderungen vornehmen und entsprechend gutschreiben.
| |
| − |
| |
| − | Verweise
| |
| − | Ich habe einige externe Quellen verwendet, um diese Prozesse weiter zu verstehen. Sie sind in keiner bestimmten Reihenfolge:
| |
| − |
| |
| − | https://en.wikipedia.org/wiki/IEEE_802.11i-2004
| |
| − | http://tools.ietf.org/html/rfc2104
| |
| − | http://www.tldp.org/HOWTO/8021X-HOWTO/intro.htmlür jeden Wörterbucheintrag (oder Brute-Force-Versuch) während des Passwortknackens erneut ausgeführt, was der Grund für die langsame Leistung von Hashcat, Cowpatty und John The Ripper ist (obwohl ich immer noch 100.000 Hashes P/s verwalte). mit Oclhashcat, was zeigt, wie fantastisch der Code von Atom optimiert ist).
| |
| − |
| |
| − | Sobald das zweite Paket des Handshakes erfasst wurde, verfügt ein Angreifer über genügend Informationen, um zu versuchen, den Pairwise-Transient-Key zu berechnen (unter Verwendung einer angenommenen PSK-Passphrase), der dann verwendet werden kann, um den Key-Confirmation-Key zu extrahieren und die Nachricht zu berechnen compute Integritätscode. Es ist dieser MIC, der beim Vergleich mit dem echten MIC verwendet wird, um die Gültigkeit der angenommenen PSK zu bestimmen.
| |
| − |
| |
| − | Dieser ganze Prozess wird fDer einzige Hinweis auf eine verwendbare PRF512-Funktion in Python war ein Codeauszug aus einer Frage zu Stack Overflow aus dem Jahr 2012:
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − | PythonKopieren
| |
| − | Einige Beispielcodes, um eine Visualisierung dessen zu erhalten, was im Hintergrund passiert:
| |
| − |
| |
| − | #! /usr/bin/env python
| |
| − |
| |
| − | import hmac,hashlib,binascii,sha
| |
| − | from pbkdf2 import PBKDF2
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − |
| |
| − | ssid = raw_input('SSID: ')
| |
| − | passphrase = raw_input('Passphrase: ')
| |
| − | ap_mac = binascii.a2b_hex(raw_input("AP MAC: "))
| |
| − | s_mac = binascii.a2b_hex(raw_input("Client MAC: "))
| |
| − | anonce = binascii.a2b_hex(raw_input("ANonce: "))
| |
| − | snonce = binascii.a2b_hex(raw_input("SNonce: "))
| |
| − |
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − | pke = "Pairwise key expansion"
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − |
| |
| − | pmk = PBKDF2(passphrase, ssid, 4096).read(32)
| |
| − | ptk = customPRF512(pmk,pke,key_data).encode('hex')
| |
| − |
| |
| − | print ("\nPMKey: " + pmk)
| |
| − | print ("PTKey: " + ptk)
| |
| − | print ("KCK: " + ptk[0:16])
| |
| − | PythonKopieren
| |
| − | Der PMK und der PTK werden dann an das Terminal gedruckt, wobei die ersten 16 Bytes des PTK der KCK sind.
| |
| − |
| |
| − | Was wird eigentlich für das Knacken berechnet?
| |
| − | Sobald das zweite Paket des Handshakes erfasst wurde, verfügt ein Angreifer über genügend Informationen, um zu versuchen, den Pairwise-Transient-Key zu berechnen (unter Verwendung einer angenommenen PSK-Passphrase), der dann verwendet werden kann, um den Key-Confirmation-Key zu extrahieren und die Nachricht zu berechnen compute Integritätscode. Es ist dieser MIC, der beim Vergleich mit dem echten MIC verwendet wird, um die Gültigkeit der angenommenen PSK zu bestimmen.
| |
| − |
| |
| − | Dieser ganze Prozess wird für jeden Wörterbucheintrag (oder Brute-Force-Versuch) während des Passwortknackens erneut ausgeführt, was der Grund für die langsame Leistung von Hashcat, Cowpatty und John The Ripper ist (obwohl ich immer noch 100.000 Hashes P/s verwalte). mit Oclhashcat, was zeigt, wie fantastisch der Code von Atom optimiert ist).
| |
| − |
| |
| − | Der MIC wird unter Verwendung von HMAC_MD5 berechnet, das seine Eingabe vom KCK-Schlüssel innerhalb des PTK erhält. Leider war ich nicht in der Lage, Python-Code zur Berechnung des MIC zu finden, selbst nachdem ich den Quellcode von Aircrack-ng und Cowpatty überprüft hatte (meine C-Kenntnisse fehlen stark). Erweitere das oben Gesagte und lass es mich wissen, wenn jemand eine Idee hat!
| |
| − |
| |
| − | Schlussfolgerungen
| |
| − | Wenn ich den Rechenaufwand für jeden Versuch des Vergleichs der MICs kenne, beruhigt mich die Sicherheit der Verwendung von PSK-Authentifizierung in persönlichen Netzwerken etwas, aber es beweist, wie unschätzbar zufällige Passphrasen in verschiedenen kryptografischen Implementierungen wie dieser sind , insbesondere Passphrasen, die länger sind und mehr Entropie enthalten. Verwenden Sie für Ihr PSK eine Passphrase mit 15 Zeichen, die eine Kombination aus Groß- und Kleinbuchstaben, numerischen und Sonderzeichen enthält, die kein Wörterbuchwort sind . Oh, und ändern Sie es auch regelmäßig. Wenn ich oder jemand anderes Ihre Passphrase knacken würde, würde ein Angreifer nicht viel davon gebrauchen können. Wenn er in einem Monat dorthin zurückkehrt, kann keine Verbindung hergestellt werden, da er auf einen neuen Wert geändert wurde.
| |
| − |
| |
| − | Noch wichtiger ist, dass Sie für Ihre Unternehmensnetzwerke keine PSK-Authentifizierung verwenden. Es gibt zwar einige Schwachstellen in bestimmten EAP-Konfigurationen, diese sind jedoch viel einfacher zu beseitigen als ein Offline-Angriff, wie er gegen PSKs in der Lage ist.
| |
| − |
| |
| − | Wenn eine der oben genannten Informationen falsch ist, senden Sie mir bitte eine E-Mail und ich werde die erforderlichen Änderungen vornehmen und entsprechend gutschreiben.
| |
| − |
| |
| − | Verweise
| |
| − | Ich habe einige externe Quellen verwendet, um diese Prozesse weiter zu verstehen. Sie sind in keiner bestimmten Reihenfolge:
| |
| − |
| |
| − | https://en.wikipedia.org/wiki/IEEE_802.11i-2004
| |
| − | http://tools.ietf.org/html/rfc2104
| |
| − | http://www.tldp.org/HOWTO/8021X-HOWTO/intro.htmlDer einzige Hinweis auf eine verwendbare PRF512-Funktion in Python war ein Codeauszug aus einer Frage zu Stack Overflow aus dem Jahr 2012:
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − | PythonKopieren
| |
| − | Einige Beispielcodes, um eine Visualisierung dessen zu erhalten, was im Hintergrund passiert:
| |
| − |
| |
| − | #! /usr/bin/env python
| |
| − |
| |
| − | import hmac,hashlib,binascii,sha
| |
| − | from pbkdf2 import PBKDF2
| |
| − |
| |
| − | def customPRF512(key,A,B):
| |
| − | blen = 64
| |
| − | i = 0
| |
| − | R = ''
| |
| − | while i<=((blen*8+159)/160):
| |
| − | hmacsha1 = hmac.new(key,A+chr(0x00)+B+chr(i),hashlib.sha1)
| |
| − | i+=1
| |
| − | R = R+hmacsha1.digest()
| |
| − | return R[:blen]
| |
| − |
| |
| − | ssid = raw_input('SSID: ')
| |
| − | passphrase = raw_input('Passphrase: ')
| |
| − | ap_mac = binascii.a2b_hex(raw_input("AP MAC: "))
| |
| − | s_mac = binascii.a2b_hex(raw_input("Client MAC: "))
| |
| − | anonce = binascii.a2b_hex(raw_input("ANonce: "))
| |
| − | snonce = binascii.a2b_hex(raw_input("SNonce: "))
| |
| − |
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − | pke = "Pairwise key expansion"
| |
| − | key_data = min(ap_mac,s_mac) + max(ap_mac,s_mac) + min(anonce,snonce) + max(anonce,snonce)
| |
| − |
| |
| − | pmk = PBKDF2(passphrase, ssid, 4096).read(32)
| |
| − | ptk = customPRF512(pmk,pke,key_data).encode('hex')
| |
| − |
| |
| − | print ("\nPMKey: " + pmk)
| |
| − | print ("PTKey: " + ptk)
| |
| − | print ("KCK: " + ptk[0:16])
| |
| − | PythonKopieren
| |
| − | Der PMK und der PTK werden dann an das Terminal gedruckt, wobei die ersten 16 Bytes des PTK der KCK sind.
| |
| − |
| |
| − | Was wird eigentlich für das Knacken berechnet?
| |
| − | Sobald das zweite Paket des Handshakes erfasst wurde, verfügt ein Angreifer über genügend Informationen, um zu versuchen, den Pairwise-Transient-Key zu berechnen (unter Verwendung einer angenommenen PSK-Passphrase), der dann verwendet werden kann, um den Key-Confirmation-Key zu extrahieren und die Nachricht zu berechnen compute Integritätscode. Es ist dieser MIC, der beim Vergleich mit dem echten MIC verwendet wird, um die Gültigkeit der angenommenen PSK zu bestimmen.
| |
| − |
| |
| − | Dieser ganze Prozess wird für jeden Wörterbucheintrag (oder Brute-Force-Versuch) während des Passwortknackens erneut ausgeführt, was der Grund für die langsame Leistung von Hashcat, Cowpatty und John The Ripper ist (obwohl ich immer noch 100.000 Hashes P/s verwalte). mit Oclhashcat, was zeigt, wie fantastisch der Code von Atom optimiert ist).
| |
| − |
| |
| − | Der MIC wird unter Verwendung von HMAC_MD5 berechnet, das seine Eingabe vom KCK-Schlüssel innerhalb des PTK erhält. Leider war ich nicht in der Lage, Python-Code zur Berechnung des MIC zu finden, selbst nachdem ich den Quellcode von Aircrack-ng und Cowpatty überprüft hatte (meine C-Kenntnisse fehlen stark). Erweitere das oben Gesagte und lass es mich wissen, wenn jemand eine Idee hat!
| |
| − |
| |
| − | Schlussfolgerungen
| |
| − | Wenn ich den Rechenaufwand für jeden Versuch des Vergleichs der MICs kenne, beruhigt mich die Sicherheit der Verwendung von PSK-Authentifizierung in persönlichen Netzwerken etwas, aber es beweist, wie unschätzbar zufällige Passphrasen in verschiedenen kryptografischen Implementierungen wie dieser sind , insbesondere Passphrasen, die länger sind und mehr Entropie enthalten. Verwenden Sie für Ihr PSK eine Passphrase mit 15 Zeichen, die eine Kombination aus Groß- und Kleinbuchstaben, numerischen und Sonderzeichen enthält, die kein Wörterbuchwort sind . Oh, und ändern Sie es auch regelmäßig. Wenn ich oder jemand anderes Ihre Passphrase knacken würde, würde ein Angreifer nicht viel davon gebrauchen können. Wenn er in einem Monat dorthin zurückkehrt, kann keine Verbindung hergestellt werden, da er auf einen neuen Wert geändert wurde.
| |
| − |
| |
| − | Noch wichtiger ist, dass Sie für Ihre Unternehmensnetzwerke keine PSK-Authentifizierung verwenden. Es gibt zwar einige Schwachstellen in bestimmten EAP-Konfigurationen, diese sind jedoch viel einfacher zu beseitigen als ein Offline-Angriff, wie er gegen PSKs in der Lage ist.
| |
| − |
| |
| − | Wenn eine der oben genannten Informationen falsch ist, senden Sie mir bitte eine E-Mail und ich werde die erforderlichen Änderungen vornehmen und entsprechend gutschreiben.
| |
| − |
| |
| − | Verweise
| |
| − | Ich habe einige externe Quellen verwendet, um diese Prozesse weiter zu verstehen. Sie sind in keiner bestimmten Reihenfolge:
| |
| − |
| |
| − | https://en.wikipedia.org/wiki/IEEE_802.11i-2004
| |
| − | http://tools.ietf.org/html/rfc2104
| |
| − | http://www.tldp.org/HOWTO/8021X-HOWTO/intro.htmlür jeden Wörterbucheintrag (oder Brute-Force-Versuch) während des Passwortknackens erneut ausgeführt, was der Grund für die langsame Leistung von Hashcat, Cowpatty und John The Ripper ist (obwohl ich immer noch 100.000 Hashes P/s verwalte). mit Oclhashcat, was zeigt, wie fantastisch der Code von Atom optimiert ist).
| |
| − |
| |
| − | Der MIC wird unter Verwendung von HMAC_MD5 berechnet, das seine Eingabe vom KCK-Schlüssel innerhalb des PTK erhält. Leider war ich nicht in der Lage, Python-Code zur Berechnung des MIC zu finden, selbst nachdem ich den Quellcode von Aircrack-ng und Cowpatty überprüft hatte (meine C-Kenntnisse fehlen stark). Erweitere das oben Gesagte und lass es mich wissen, wenn jemand eine Idee hat!
| |
| − |
| |
| − | Schlussfolgerungen
| |
| − | Wenn ich den Rechenaufwand für jeden Versuch des Vergleichs der MICs kenne, beruhigt mich die Sicherheit der Verwendung von PSK-Authentifizierung in persönlichen Netzwerken etwas, aber es beweist, wie unschätzbar zufällige Passphrasen in verschiedenen kryptografischen Implementierungen wie dieser sind , insbesondere Passphrasen, die länger sind und mehr Entropie enthalten. Verwenden Sie für Ihr PSK eine Passphrase mit 15 Zeichen, die eine Kombination aus Groß- und Kleinbuchstaben, numerischen und Sonderzeichen enthält, die kein Wörterbuchwort sind . Oh, und ändern Sie es auch regelmäßig. Wenn ich oder jemand anderes Ihre Passphrase knacken würde, würde ein Angreifer nicht viel davon gebrauchen können. Wenn er in einem Monat dorthin zurückkehrt, kann keine Verbindung hergestellt werden, da er auf einen neuen Wert geändert wurde.
| |
| − |
| |
| − | Noch wichtiger ist, dass Sie für Ihre Unternehmensnetzwerke keine PSK-Authentifizierung verwenden. Es gibt zwar einige Schwachstellen in bestimmten EAP-Konfigurationen, diese sind jedoch viel einfacher zu beseitigen als ein Offline-Angriff, wie er gegen PSKs in der Lage ist.
| |
| − |
| |
| − | Wenn eine der oben genannten Informationen falsch ist, senden Sie
| |
| − | Der MIC wird unter Verwendung von HMAC_MD5 berechnet, das seine Eingabe vom KCK-Schlüssel innerhalb des PTK erhält. Leider war ich nicht in der Lage, Python-Code zur Berechnung des MIC zu finden, selbst nachdem ich den Quellcode von Aircrack-ng und Cowpatty überprüft hatte (meine C-Kenntnisse fehlen stark). Erweitere das oben Gesagte und lass es mich wissen, wenn jemand eine Idee hat!
| |
| − |
| |
| − | Schlussfolgerungen
| |
| − | Wenn ich den Rechenaufwand für jeden Versuch des Vergleichs der MICs kenne, beruhigt mich die Sicherheit der Verwendung von PSK-Authentifizierung in persönlichen Netzwerken etwas, aber es beweist, wie unschätzbar zufällige Passphrasen in verschiedenen kryptografischen Implementierungen wie dieser sind , insbesondere Passphrasen, die länger sind und mehr Entropie enthalten. Verwenden Sie für Ihr PSK eine Passphrase mit 15 Zeichen, die eine Kombination aus Groß- und Kleinbuchstaben, numerischen und Sonderzeichen enthält, die kein Wörterbuchwort sind . Oh, und ändern Sie es auch regelmäßig. Wenn ich oder jemand anderes Ihre Passphrase knacken würde, würde ein Angreifer nicht viel davon gebrauchen können. Wenn er in einem Monat dorthin zurückkehrt, kann keine Verbindung hergestellt werden, da er auf einen neuen Wert geändert wurde.
| |
| − |
| |
| − | Noch wichtiger ist, dass Sie für Ihre Unternehmensnetzwerke keine PSK-Authentifizierung verwenden. Es gibt zwar einige Schwachstellen in bestimmten EAP-Konfigurationen, diese sind jedoch viel einfacher zu beseitigen als ein Offline-Angriff, wie er gegen PSKs in der Lage ist.
| |
| − |
| |
| − | Wenn eine der oben genannten Informationen falsch ist, senden Sie mir bitte eine E-Mail und ich werde die erforderlichen Änderungen vornehmen und entsprechend gutschreiben.
| |
| − |
| |
| − | Verweise
| |
| − | Ich habe einige externe Quellen verwendet, um diese Prozesse weiter zu verstehen. Sie sind in keiner bestimmten Reihenfolge:
| |
| − |
| |
| − | https://en.wikipedia.org/wiki/IEEE_802.11i-2004
| |
| − | http://tools.ietf.org/html/rfc2104
| |
| − | http://www.tldp.org/HOWTO/8021X-HOWTO/intro.html
| |