Zur Haupt­na­vi­ga­ti­on sprin­gen [Alt]+[0] Zum Sei­ten­in­halt sprin­gen [Alt]+[1]

Ha­shing

Vor­be­mer­kun­gen

Be­grif­fe:

  • Ein­ga­be: Die Ur­sprungs­da­ten, aus wel­chen der Hash ge­bil­det wird (z.B. Zahl, Text, Bi­när­da­ten)
  • Hash­funk­ti­on: Das Ver­fah­ren, mit dem der Hash ge­bil­det wird.
  • Hashwert: Das Er­geb­nis des Ha­shings.
  • Nicht­um­kehr­bar­keit: Der Hash lässt kei­nen Rück­schluss auf die Ein­ga­be zu.
  • Kol­li­si­on: wenn aus zwei Ein­ga­ben der sel­ben Hashwert ge­bil­det wird.
  • Salt: für Pass­wort-Ha­shing be­nutzt, wird vor dem Ha­shing an die Ein­ga­be an­ge­hängt um An­grif­fe per vor­be­rech­ne­ten Hash-Ta­bel­len zu ver­hin­dern.
  • Rounds: für Pass­wort-Ha­shing be­nutzt, Hash wird mehr­fach be­rech­net um Brute-Force-An­grif­fe zu ver­lang­sa­men

Ziel:

  • 3.​3.​1.​1 (9) das Kon­zept von Hash­funk­tio­nen und An­for­de­run­gen an diese (unter an­de­rem Nicht­um­kehr­bar­keit, Ver­mei­dung von Kol­li­sio­nen) be­schrei­ben und die­ses an Bei­spie­len (zum Bei­spiel Fin­ger­print, In­te­gri­täts­prü­fung, ISBN-Prüf­sum­me) er­läu­tern.
  • 3.3.4 (4) spe­zi­el­le An­for­de­run­gen an kryp­to­lo­gi­sche Hash­funk­tio­nen und An­wen­dun­gen in der Kryp­to­lo­gie er­läu­tern (zum Bei­spiel Fin­ger­print, Si­gna­tur, Pass­wort­has­hes)

Ein­füh­rung: Hash­funk­ti­on

Unter einer Hash­funk­ti­on ver­steht man eine Funk­ti­on, die eine große Ein­ga­be­men­ge auf eine klei­ne­re Ziel­men­ge ab­bil­det. Eine Hash­funk­ti­on ist des­halb im All­ge­mei­nen nicht um­kehr­bar.

Als ein­fa­ches Bei­spiel lässt sich als Hash­funk­ti­on für Zah­len die (to­ta­le) Quer­sum­me nut­zen:

  • 15 → 6
  • 64 → 1
  • 72 → 9
  • 923 → 5
  • 7302 → 3
  • 532 → 1

An­wen­dun­gen

Ha­shing wird zum einen ver­wen­det, um (Über­tra­gungs-)Feh­ler zu er­ken­nen. Hier­bei spricht man oft auch von Prüf­sum­men (bei klei­ne­ren Da­ten­men­gen) oder von Fin­ger­prints (eher bei grö­ße­ren Bi­när­da­ten).

Zum an­de­ren wird die Nicht­um­kehr­bar­keit von Has­hes dazu ver­wen­det, Pass­wör­ter auf si­che­re Weise ab­zu­spei­chern. Hier­für wer­den zu­sätz­lich zur Feh­ler­er­ken­nung wei­te­re si­cher­heits­re­le­van­te Ei­gen­schaf­ten an die Hash­funk­ti­on ge­stellt.

Kol­li­sio­nen

Wie man an dem Bei­spiel be­reits er­ken­nen kann, wird so­wohl für die 15 als auch für die 532 der selbe Hash (= die selbe Quer­sum­me) er­zeugt. Er­zeu­gen meh­re­re Aus­gangs­tex­te den sel­ben Hash, so spricht man von einer Kol­li­si­on.

Feh­ler­er­ken­nung und -kor­rek­tur

Hash­funk­tio­nen wer­den bei­spiels­wei­se ge­nutzt, um Feh­ler zu er­ken­nen und ggf. zu kor­ri­gie­ren. Bei­spie­le hier­für sind die Da­ten­über­tra­gung über das In­ter­net (TCP) oder auch eine IBAN. Hier­für wird zu­sätz­lich zu den ei­gent­li­chen Daten ein Hash die­ser Daten über­tra­gen bzw. an­ge­ge­ben. Man spricht dabei auch von einer Prüf­sum­me oder Fin­ger­print.

Hash­ver­fah­ren las­sen sich da­hin­ge­hend klas­si­fi­zie­ren, ob und wie viele Feh­ler diese er­ken­nen oder sogar be­he­ben kön­nen. Feh­ler, die auf­tre­ten könn­ten, sind bei­spiels­wei­se bei einer Über­wei­sung per IBAN:

  • Tipp­feh­ler ein­zel­ner Zif­fern
  • Ver­ges­sen einer Zif­fer
  • Dop­pel­te Ein­ga­be einer Zif­fer
  • Ver­tau­schung von zwei Zif­fern

Würde man hier­für die Quer­sum­me als Hash­funk­ti­on nut­zen, so er­kennt man di­rekt, dass zwar ein Feh­ler mit einer Zif­fer er­kannt wer­den könn­te, die Quer­sum­me zur Er­ken­nung von Zah­len­dre­hern je­doch nicht ge­eig­net ist.

Damit eine Feh­ler­er­ken­nung zu­ver­läs­sig funk­tio­niert, soll­ten selbst kleins­te Än­de­run­gen an der Ein­ga­be eine mög­lichst große Än­de­rung des Has­hes be­wir­ken.

Ein ein­fach nach­zu­rech­nen­des Hash­ver­fah­ren wird bei ISBN ver­wen­det. Eine ISBN-Num­mer be­steht aus 9 „Daten-Zif­fern“ und einer Prüf­zif­fer. Für die Be­rech­nung der Prüf­zif­fer wird die erste Zif­fer der ISB-Num­mer mit 1 mul­ti­pli­ziert, die zwei­te mit 2 usw. Am Ende wird die Summe dar­aus durch 11 ge­teilt. Der ganz­zah­li­ge Rest er­gibt die Prüf­zif­fer, bzw. „X“, falls der Rest 10 er­gibt:

Bei­spiel: ISBN 3-446-19313-[?] (Fer­mats letz­ter Satz)

3*1 + 4*2 + 4*3 + 6*4 + 1*5 + 9*6 + 3*7 + 1*8 + 3*9 = 162 : 11 = 14 Rest 8 → Prüf­zif­fer 8

Durch die un­ter­schied­li­che Wer­tung der Zif­fern wer­den damit – im Ge­gen­satz zur ein­fa­chen Quer­sum­me – auch Zah­len­dre­her er­kannt.

Pass­wort­spei­che­rung als Hash: Kryp­to­lo­gi­sche An­for­de­run­gen

Hash­funk­tio­nen haben neben der Feh­ler­er­ken­nung noch eine wei­te­re we­sent­li­che Funk­ti­on, die in­zwi­schen auch nach DSGVO vor­ge­schrie­ben ist. An­bie­ter von Dienst­leis­tun­gen dür­fen Pass­wör­ter von Kun­den nicht mehr im Klar­text spei­chern, als Schutz vor Iden­ti­täts­dieb­stahl. Wir dies nicht be­ach­tet, kön­nen gegen Un­ter­neh­men hohe Stra­fen ver­hängt wer­den.

Wird eine Da­ten­bank von kri­mi­nel­len An­grei­fern mit­hil­fe von Si­cher­heits­lü­cken ko­piert, so hät­ten diese Zu­griff auf die Pas­sör­ter der Kun­den, und könn­ten die sel­ben Pass­wör­ter bei an­de­ren In­ter­net­diens­ten aus­pro­bie­ren.

Um die Si­cher­heit auch im Falle eines Da­ten­lecks zu er­hö­hen, müs­sen Pass­wör­ter z.B. als Hash ab­ge­spei­chert wer­den. Damit ein An­grei­fer aus den Has­hes nicht die Pass­wör­ter re­kon­stru­ie­ren kann, müs­sen dort ver­wen­de­te Hash­funk­tio­nen spe­zi­el­le An­for­de­run­gen er­fül­len.

Ab­lauf Pass­wort­über­prü­fung und Än­de­rung

Bei der Über­prü­fung, ob ein Nut­zer sein Pass­wort rich­tig ein­ge­ge­ben hat, wird von dem ein­ge­ge­be­nen Pass­wort der Hash ge­bil­det und das Er­geb­nis mit dem in der Da­ten­bank ge­spei­cher­ten Hash ver­gli­chen.

Ablauf Passwortüberprüfung und Änderung

Bild­quel­le: Ab­lauf Pass­wort­über­prü­fung und Än­de­rung von ZPG In­for­ma­tik [CC BY-SA 4.0 DE], aus 1_hin­ter­grund.odt, be­ar­bei­tet

Dabei ist es un­er­heb­lich, ob man das rich­ti­ge Pass­wort ein­ge­ge­ben hat oder ein an­de­res ver­wen­det, das aber den sel­ben Hash er­zeugt! Würde das Nut­zer­pass­wort „123“ also ein­fach als Quer­sum­me „6“ ab­ge­spei­chert, so könn­te man sich eben­falls mit dem Pass­wort „321“ an­mel­den. Für einen An­grei­fer, der sich Zu­gang zur Da­ten­bank ver­schafft hat und damit den Pass­wort­hash „6“ lesen kann, wäre es ein leich­tes, sich ein Pass­wort zu ge­ne­rie­ren, wel­ches diese Quer­sum­me er­zeugt.

Damit die­ser Fall nicht ein­tritt, müs­sen Hash­funk­tio­nen, die für Pass­wort­ab­si­che­rung ver­wen­det wer­den, kol­li­si­ons­re­sis­tent sein. Das be­deu­tet: es muss mög­lichst schwer sein, zwei be­lie­bi­ge Ein­ga­ben zu fin­den, die den sel­ben Hash er­zeu­gen.

Gän­gi­ge Ver­fah­ren waren bzw. sind: (je­weils als Bei­spiel, ist der Hash von „123456“ ab­ge­bil­det)

  • MD5 (nicht mehr si­cher!):
    e10ad­c3949ba59ab­be56e057f20f883e
  • SHA-1 (eben­falls nicht mehr si­cher!):
    7c4a8d09­ca3762af61e59520943d­c26494f8941b
  • SHA-256:
    8d969ee­f6e­ca­d3c29a3a629280e686c­f0c3f5d5a86af­f3­ca12020c923ad­c6c92
  • SHA-512:
    ba3253876a­ed6b­c22d4a6f­f53d8406c6a­d864195e­d144a­b5c87621b6c233b54­8­b­a­e­a­e­6­9­5­6­d­f­3­4­6­e­c­8­c­1­7­f­5­e­a­1­0­f­3­5­e­e­3­c­b­c­5­1­4­7­9­7­e­d­7­d­d­d­3­1­4­5­4­6­4­e­2­a­0­b­a­b­4­13

Zu­sätz­li­che Si­cher­heit durch Salt

Im In­ter­net kur­sie­ren für alle gän­gi­gen Hash­funk­tio­nen di­ver­se Ta­bel­len mit vor­be­rech­ne­ten Pass­wör­tern. So kann für das MD5-Ver­fah­ren für den Hash e10ad­c3949ba59ab­be56e057f20f883e di­rekt nach­ge­schaut wer­den, dass hier­für die Ein­ga­be „123456“ nötig ist. Für die gän­gi­gen Hash-Funk­tio­nen exis­tie­ren ent­spre­chen­de Wör­ter­bü­cher, z.B. auf https://​cra​ckst​atio​n.​net.

Um diese Mög­lich­keit für An­grei­fer eben­falls zu un­ter­bin­den, spei­chert man neben dem Hashwert auch noch einen zu­fäl­lig ge­ne­rier­ten Salt. Die­ser Salt wird an die Be­nut­zer­ein­ga­be an­ge­hängt, bevor der Hash ge­bil­det wird.

Bei­spiel: für das Nut­zer­pass­wort „123456“ wird ein zu­fäl­li­ger Salt „95be“ ge­ne­riert und an das Pass­wort an­ge­hängt. Es wird also der Hash von „12345695­be“ ge­bil­det und zu­sam­men mit dem Salt ge­spei­chert:

  • Hash: 913d6b­fec025a4b5­fa­ed­f786a­eb6c1a7
  • Salt: 95be

Zusätzliche Sicherheit durch Salt

Bild­quel­le: Zu­sätz­li­che Si­cher­heit durch Salt von ZPG In­for­ma­tik [CC BY-SA 4.0 DE], aus 1_hin­ter­grund.odt, be­ar­bei­tet

Das ganze pas­siert ser­ver­sei­tig, völ­lig un­be­merkt vom Be­nut­zer. Die Si­cher­heit wird da­durch noch­mals deut­lich er­höht, da durch einen aus­rei­chend lan­gen, zu­fäl­li­gen Salt ga­ran­tiert wer­den kann, dass sich diese „ge­sal­ze­ne“ Ein­ga­be nicht mehr in vor­be­rech­ne­ten Ta­bel­len nach­schla­gen lässt. Damit wird selbst ein Pass­wort wie „123456“ si­che­rer12 und es bleibt dem An­grei­fer nur ein Brute-Force-An­griff.

Die­ser Salt kann für jeden Be­nut­zer in­di­vi­du­ell ge­ne­riert und zu­sätz­lich zum Hash-Wert ge­spei­chert wer­den.

Hash­ver­fah­ren zur Si­gnie­rung und In­te­gri­täts­prü­fung

Neben der si­che­ren Pass­wort­spei­che­rung wer­den Hash­ver­fah­ren auch dazu ge­nutzt, um Da­ten­über­tra­gun­gen ab­zu­si­chern. So lässt sich auch von Bi­när­da­ten, Nach­rich­ten o.ä. ein Hashwert bil­den und so ab­si­chern, dass daran wäh­rend der Über­tra­gung nichts ma­ni­pu­liert wurde.

An­mer­kung: Dazu muss na­tür­lich der Hash-Wert auf einem an­de­ren, si­che­ren Weg über­tra­gen wor­den sein!

 

12 Na­tür­lich ist das Pass­wort „123456“ den­noch nicht si­cher, denn selbst mit einem Brute-Force-An­griff lässt sich die­ses sehr schnell her­aus­fin­den!

 

Hin­ter­grund­in­for­ma­tio­nen: Her­un­ter­la­den [odt][1 MB]

 

Wei­ter zu Pass­wort­hash