Der Begriff SHA, ausgeschrieben secure hash algorithm, bezeichnet eine Gruppe standardisierter kryptologischer Hashfunktionen.
Hört sich erst einmal fürchterlich kompliziert an, beschreibt aber nur die Erstellung eines Prüfwertes und ist Grundlage für die digitale Signatur.
Es wird aus einem gegebenen "String" ein Prüfwert berechnet.
Dieser Prüfwert kann dann von jeder Stelle aus nachberechnet werden und muss immer zum gleichen Ergebnis führen, um die Integrität der Nachricht zu garantieren.
Er soll auch nicht zurückrechnbar sein auf die originale Nachricht und soll einmalig sein. Also keine zwei unterschiedliche Nachrichten dieser Welt erhalten den gleichen Schlüssel.
Einfaches Beispiel zur Anwendbarkeit:
Eine Datenbank hat eingerichtete Benutzer.
Möchte man sich nun als Benutzer dieser Datenbank mit der Datenbank verbinden, könnte man den Benutzernamen und das Passwort in "Plain Text" also unverschlüsselt übertragen.
Das wäre natürlich keine gute Idee! Das Passwort wäre dann unverschlüsselt in einem TCP/IP Paket zu lesen!
Die Lösung:
Man erzeugt von dem Passwort und weiterer Daten einen SHA Schlüssel und sendet diesen zur Datenbank. Diese berechnet ihrerseits einen Schlüssel, welche mit dem empfangenen übereinstimmen muss.
Alles anzeigen
Hört sich erst einmal fürchterlich kompliziert an, beschreibt aber nur die Erstellung eines Prüfwertes und ist Grundlage für die digitale Signatur.
Es wird aus einem gegebenen "String" ein Prüfwert berechnet.
Dieser Prüfwert kann dann von jeder Stelle aus nachberechnet werden und muss immer zum gleichen Ergebnis führen, um die Integrität der Nachricht zu garantieren.
Er soll auch nicht zurückrechnbar sein auf die originale Nachricht und soll einmalig sein. Also keine zwei unterschiedliche Nachrichten dieser Welt erhalten den gleichen Schlüssel.
Einfaches Beispiel zur Anwendbarkeit:
Eine Datenbank hat eingerichtete Benutzer.
Möchte man sich nun als Benutzer dieser Datenbank mit der Datenbank verbinden, könnte man den Benutzernamen und das Passwort in "Plain Text" also unverschlüsselt übertragen.
Das wäre natürlich keine gute Idee! Das Passwort wäre dann unverschlüsselt in einem TCP/IP Paket zu lesen!
Die Lösung:
Man erzeugt von dem Passwort und weiterer Daten einen SHA Schlüssel und sendet diesen zur Datenbank. Diese berechnet ihrerseits einen Schlüssel, welche mit dem empfangenen übereinstimmen muss.
BASCOM-Quellcode
- '*******************************************************************************
- ' SHA-1 HASH
- '*******************************************************************************
- '
- ' Copyright Michael Koecher aka six1 1/2011
- ' -> http://www.six1.net/ michael@koecher-web.de
- '
- ' http://creativecommons.org/licenses/by-sa/3.0/de/
- '
- ' Sie dürfen:
- '
- ' * das Werk bzw. den Inhalt vervielfältigen, verbreiten und öffentlich zugänglich machen
- '
- ' * Abwandlungen und Bearbeitungen des Werkes bzw. Inhaltes anfertigen
- '
- ' Zu Den Folgenden Bedingungen:
- '
- ' * Namensnennung.
- ' Sie müssen den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen.
- '
- ' * Keine kommerzielle Nutzung.
- ' Dieses Werk darf nicht für kommerzielle Zwecke verwendet werden.
- '
- ' * Weitergabe unter gleichen Bedingungen.
- ' Wenn Sie das lizenzierte Werk bzw. den lizenzierten Inhalt bearbeiten
- ' oder in anderer Weise erkennbar als Grundlage für eigenes Schaffen verwenden,
- ' dürfen Sie die daraufhin neu entstandenen Werke bzw. Inhalte nur
- ' unter Verwendung von Lizenzbedingungen weitergeben, die mit denen
- ' dieses Lizenzvertrages identisch oder vergleichbar sind.
- '
- ' Wobei gilt:
- '
- ' * Verzichtserklärung
- ' Jede der vorgenannten Bedingungen kann aufgehoben werden, sofern Sie
- ' die ausdrückliche Einwilligung des Rechteinhabers dazu erhalten.
- '
- ' * Sonstige Rechte
- ' Die Lizenz hat keinerlei Einfluss auf die folgenden Rechte:
- ' - Die gesetzlichen Schranken des Urheberrechts und sonstigen
- ' Befugnisse zur privaten Nutzung
- ' - Das Urheberpersönlichkeitsrecht des Rechteinhabers
- ' - Rechte anderer Personen, entweder am Lizenzgegenstand selber oder
- ' bezüglich seiner Verwendung, zum Beispiel Persönlichkeitsrechte abgebildeter Personen.
- '
- ' Hinweis
- '
- ' Im Falle einer Verbreitung müssen Sie anderen alle Lizenzbedingungen
- ' mitteilen, die für dieses Werk gelten. Am einfachsten ist es,
- ' einen Link auf http://creativecommons.org/licenses/by-sa/3.0/de/ einzubinden.
- '
- '*******************************************************************************
- $regfile = "m128def.dat"
- '-------------------------------------------------------------------------------
- 'for 16MHz
- $crystal = 16000000
- '-------------------------------------------------------------------------------
- $baud = 57600
- $hwstack = 10
- $swstack = 20
- $framesize = 100
- Open "Com1:" For Binary As #1
- '-------------------------------------------------------------------------------
- ' VARIABLES
- '-------------------------------------------------------------------------------
- Dim Sha1_hash(8) As Long
- Dim Sha1_hash_1 As Long At Sha1_hash Overlay
- Dim Sha1_hash_2 As Long At Sha1_hash + 4 Overlay
- Dim Sha1_hash_3 As Long At Sha1_hash + 8 Overlay
- Dim Sha1_hash_4 As Long At Sha1_hash + 12 Overlay
- Dim Sha1_hash_5 As Long At Sha1_hash + 16 Overlay
- Dim Sha1_hash_6 As Long At Sha1_hash + 20 Overlay
- Dim Sha1_hash_7 As Long At Sha1_hash + 24 Overlay
- Dim Sha1_hash_8 As Long At Sha1_hash + 28 Overlay
- Dim Sha1_hash_byte(20) As Byte At Sha1_hash Overlay
- Dim Sha1_hash_str As String * 20 At Sha1_hash Overlay
- Dim Sha1_work(80) As Long
- Dim Sha1_data(16) As Long
- Dim Sha1_data_byte(64) As Byte At Sha1_data Overlay
- ' absolut maximum 63 Chars!!!
- Dim Hash_text As String * 63
- '-------------------------------------------------------------------------------
- ' SUB, FUNCTION define
- '-------------------------------------------------------------------------------
- Declare Sub Do_sha1_hash(byval Hash_str As String)
- '-------------------------------------------------------------------------------
- ' MAIN
- '-------------------------------------------------------------------------------
- ' let's define our text, we want to get the SHA-1 Hash from
- ' 63 Chars
- 'Hash_text = "abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc"
- ' 3 Chars
- Hash_text = "abc"
- ' Call to SHA-1 function
- Call Do_sha1_hash(hash_text)
- ' Output the result
- Print "Cypher Text: ";hash_text
- Print "SHA-1 : $" ; Hex(sha1_hash_1) ; Hex(sha1_hash_2) ; Hex(sha1_hash_3) ; Hex(sha1_hash_4) ; Hex(sha1_hash_5)
- ' that's all :-) have fun, michael
- End
- Sub Do_sha1_hash(byval Password As String)
- Local X As Byte , Y As Byte , Z As Byte , Help_char As String * 1
- Local T As Byte
- local len_word as word
- ' string data into long array
- For Z = 1 To 64
- Sha1_data_byte(z) = &H00
- Next
- X = 1
- Y = 4
- While X <= Len(hash_str)
- Help_char = Mid(hash_str , X , 1)
- Sha1_data_byte(y) = Asc(help_char)
- Z = X Mod 4
- If Z = 0 Then Y = Y + 8
- Decr Y
- Incr X
- Wend
- Sha1_data_byte(y) = &H80
- Len_word = Len(hash_str) * 8
- Sha1_data_byte(61) = Low(len_word)
- Sha1_data_byte(62) = High(len_word)
- Sha1_hash_1 = &H67452301
- Sha1_hash_2 = &HEFCDAB89
- Sha1_hash_3 = &H98BADCFE
- Sha1_hash_4 = &H10325476
- Sha1_hash_5 = &HC3D2E1F0
- For T = 0 To 79
- If T <= 19 Then
- Sha1_hash_6 = Sha1_hash_2 And Sha1_hash_3
- Sha1_hash_8 = Not Sha1_hash_2
- Sha1_hash_8 = Sha1_hash_8 And Sha1_hash_4
- Sha1_hash_6 = Sha1_hash_6 Or Sha1_hash_8
- End If
- If 20 <= T And T <= 39 Then
- Sha1_hash_6 = Sha1_hash_2 Xor Sha1_hash_3
- Sha1_hash_6 = Sha1_hash_6 Xor Sha1_hash_4
- End If
- If 40 <= T And T <= 59 Then
- Sha1_hash_6 = Sha1_hash_2 And Sha1_hash_3
- Sha1_hash_8 = Sha1_hash_2 And Sha1_hash_4
- Sha1_hash_6 = Sha1_hash_6 Or Sha1_hash_8
- Sha1_hash_8 = Sha1_hash_3 And Sha1_hash_4
- Sha1_hash_6 = Sha1_hash_6 Or Sha1_hash_8
- End If
- If 60 <= T And T <= 79 Then
- Sha1_hash_6 = Sha1_hash_2 Xor Sha1_hash_3
- Sha1_hash_6 = Sha1_hash_6 Xor Sha1_hash_4
- End If
- If T <= 15 Then
- Sha1_work(t + 1) = Sha1_data(t + 1)
- End If
- If 16 <= T And T <= 79 Then
- Sha1_hash_8 = Sha1_work(t -2) Xor Sha1_work(t -7)
- Sha1_hash_8 = Sha1_hash_8 Xor Sha1_work(t -13)
- Sha1_hash_8 = Sha1_hash_8 Xor Sha1_work(t -15)
- Rotate Sha1_hash_8 , Left
- Sha1_work(t + 1) = Sha1_hash_8
- End If
- If T <= 19 Then
- Sha1_hash_7 = &H5A827999
- End If
- If 20 <= T And T <= 39 Then
- Sha1_hash_7 = &H6ED9EBA1
- End If
- If 40 <= T And T <= 59 Then
- Sha1_hash_7 = &H8F1BBCDC
- End If
- If 60 <= T And T <= 79 Then
- Sha1_hash_7 = &HCA62C1D6
- End If
- Rotate Sha1_hash_1 , Left , 5
- Sha1_hash_8 = Sha1_hash_1 + Sha1_hash_6
- Rotate Sha1_hash_1 , Right , 5
- Sha1_hash_8 = Sha1_hash_8 + Sha1_work(t + 1)
- Sha1_hash_6 = Sha1_hash_7 + Sha1_hash_5
- Sha1_hash_8 = Sha1_hash_8 + Sha1_hash_6
- Sha1_hash_5 = Sha1_hash_4
- Sha1_hash_4 = Sha1_hash_3
- Rotate Sha1_hash_2 , Left , 30
- Sha1_hash_3 = Sha1_hash_2
- Sha1_hash_2 = Sha1_hash_1
- Sha1_hash_1 = Sha1_hash_8
- Next T
- Sha1_hash_1 = Sha1_hash_1 + &H67452301
- Sha1_hash_2 = Sha1_hash_2 + &HEFCDAB89
- Sha1_hash_3 = Sha1_hash_3 + &H98BADCFE
- Sha1_hash_4 = Sha1_hash_4 + &H10325476
- Sha1_hash_5 = Sha1_hash_5 + &HC3D2E1F0
- End Sub
Code first, think later - Natural programmer