Droša jaukšana, izmantojot Python Hashlib

Šī apmācība jums iemācīs, kā izveidot drošas jaucējkodas, izmantojot iebūvēto funkcionalitāti no Python hashlib moduļa.

Izpratne par jaukšanas nozīmi un to, kā programmatiski aprēķināt drošus jaucējus, var būt noderīga, pat ja jūs nestrādājat ar lietojumprogrammu drošību. Bet kāpēc?

Strādājot ar Python projektiem, jūs, iespējams, saskaraties ar gadījumiem, kad esat noraizējies par paroļu un citas sensitīvas informācijas glabāšanu datu bāzēs vai pirmkoda failos. Šādos gadījumos ir drošāk palaist jaukšanas algoritmu sensitīvai informācijai un informācijas vietā saglabāt jaucēju.

Šajā rokasgrāmatā mēs apskatīsim, kas ir jaukšana un kā tā atšķiras no šifrēšanas. Mēs apskatīsim arī drošo jaucējfunkciju īpašības. Pēc tam mēs izmantosim parastos jaukšanas algoritmus, lai aprēķinātu vienkāršā teksta jaukšanu programmā Python. Lai to izdarītu, mēs izmantosim iebūvēto hashlib moduli.

Sāksim visu šo un vēl vairāk!

Kas ir jaukšana?

Jaukšanas process ņem ziņojuma virkni un nodrošina fiksēta garuma izvadi, ko sauc par jaukšanu. Tas nozīmē, ka izejas jaucējkoda garums konkrētajam jaukšanas algoritmam ir fiksēts – neatkarīgi no ievades garuma. Bet kā tas atšķiras no šifrēšanas?

Šifrējot, ziņojums vai vienkāršais teksts tiek šifrēts, izmantojot šifrēšanas algoritmu, kas nodrošina šifrētu izvadi. Pēc tam mēs varam palaist atšifrēšanas algoritmu šifrētajā izvadē, lai atgūtu ziņojuma virkni.

Tomēr jaukšana darbojas atšķirīgi. Mēs tikko uzzinājām, ka šifrēšanas process ir invertējams, jo jūs varat pāriet no šifrētā ziņojuma uz nešifrētu ziņojumu un otrādi.

Atšķirībā no šifrēšanas, jaukšana nav invertējams process, kas nozīmē, ka mēs nevaram pāriet no jaukšanas uz ievades ziņojumu.

Jaucējfunkciju īpašības

Īsi apskatīsim dažus rekvizītus, kuriem vajadzētu apmierināt jaucējfunkcijas:

  • Deterministisks: jaucējfunkcijas ir deterministiskas. Ja ir dots ziņojums m, m hash vienmēr ir vienāda.
  • Preimage Resistant: mēs jau esam to aplūkojuši, kad teicām, ka jaukšana nav apgriežama darbība. Priekšattēla pretestības rekvizīts norāda, ka nav iespējams atrast ziņojumu m no izvades jaucējkoda.
  • Sadursmju izturīgs: vajadzētu būt grūti (vai skaitļošanas ziņā neiespējami) atrast divas dažādas ziņojumu virknes m1 un m2, lai m1 jauktais būtu vienāds ar m2 jaucējvērtību. Šo īpašību sauc par sadursmes pretestību.
  • Otrais priekšattēla izturīgs: tas nozīmē, ka ir dots ziņojums m1 un atbilstošs jaucējvārds m2, nav iespējams atrast citu ziņojumu m2, kurā hash(m1) = hash(m2).
  8 labākā klientu pārvaldības programmatūra mijiedarbībai un automatizācijai

Python hashlib modulis

Python iebūvētais hashlib modulis nodrošina vairāku jaukšanas un ziņojumu apkopošanas algoritmu, tostarp SHA un MD5 algoritmu, ieviešanu.

Lai izmantotu konstruktorus un iebūvētās funkcijas no Python hashlib moduļa, varat to importēt savā darba vidē šādi:

import hashlib

Hashlib modulis nodrošina konstantes algorithms_available un algorithms_guaranteed, kas attiecīgi apzīmē algoritmu kopu, kuru implementācijas ir pieejamas un garantētas platformā.

Tāpēc algoritmi_garantēti ir algoritmu_pieejamie apakškopa.

Sāciet Python REPL, importējiet hashlib un piekļūstiet konstantēm algorithms_available un algorithms_guaranteed:

>>> hashlib.algorithms_available
# Output
{'md5', 'md5-sha1', 'sha3_256', 'shake_128', 'sha384', 'sha512_256', 'sha512', 'md4', 
'shake_256', 'whirlpool', 'sha1', 'sha3_512', 'sha3_384', 'sha256', 'ripemd160', 'mdc2', 
'sha512_224', 'blake2s', 'blake2b', 'sha3_224', 'sm3', 'sha224'}
>>> hashlib.algorithms_guaranteed
# Output
{'md5', 'shake_256', 'sha3_256', 'shake_128', 'blake2b', 'sha3_224', 'sha3_384', 
'sha384', 'sha256', 'sha1', 'sha3_512', 'sha512', 'blake2s', 'sha224'}

Mēs redzam, ka algoritmi_garantētie patiešām ir algoritmu_pieejamie apakškopa

Kā izveidot hash objektus Python

Tālāk uzzināsim, kā Python izveidot jaucējobjektus. Mēs aprēķināsim ziņojuma virknes SHA256 hash, izmantojot šādas metodes:

  • Vispārīgais new() konstruktors
  • Algoritmam specifiski konstruktori

Izmantojot jauno () konstruktoru

Inicializēsim ziņojuma virkni:

>>> message = "pcdream.lt is awesome!"

Lai izveidotu hash objektu, mēs varam izmantot konstruktoru new() un ievadīt algoritma nosaukumu, kā parādīts:

>>> sha256_hash = hashlib.new("SHA256")

Tagad mēs varam izsaukt metodi update() hash objektā ar ziņojuma virkni kā argumentu:

>>> sha256_hash.update(message)

Ja to darīsit, radīsies kļūda, jo jaukšanas algoritmi var darboties tikai ar baitu virknēm.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing

Lai iegūtu kodēto virkni, metodes virknē varat izsaukt encode() metodi un pēc tam izmantot to update() metodes izsaukumā. Pēc tam varat izsaukt hexdigest() metodi, lai iegūtu sha256 hash, kas atbilst ziņojuma virknei.

sha256_hash.update(message.encode())
sha256_hash.hexdigest()
# Output:'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'

Tā vietā, lai kodētu ziņojuma virkni, izmantojot encode() metodi, varat to definēt arī kā baitu virkni, pievienojot virknes priekšā ar b, piemēram:

message = b"pcdream.lt is awesome!"
sha256_hash.update(message)
sha256_hash.hexdigest()
# Output: 'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'

Iegūtais hash ir tāds pats kā iepriekšējais hash, kas apstiprina jaucējfunkciju deterministisko raksturu.

  Kā programmā Outlook izmantot sekošanas opciju

Turklāt nelielām izmaiņām ziņojuma virknē vajadzētu izraisīt krasas jaukšanas izmaiņas (pazīstams arī kā „lavīnas efekts”).

Lai to pārbaudītu, mainīsim “a” laukā “awesome” uz “A” un aprēķināsim jaucējvērtību:

message = "pcdream.lt is Awesome!"
h1 = hashlib.new("SHA256")
h1.update(message.encode())
h1.hexdigest()
# Output: '3c67f334cc598912dc66464f77acb71d88cfd6c8cba8e64a7b749d093c1a53ab'

Mēs redzam, ka hash pilnībā mainās.

Algoritmam specifiskā konstruktora izmantošana

Iepriekšējā piemērā mēs izmantojām vispārīgo konstruktoru new() un ievadījām “SHA256” kā algoritma nosaukumu, lai izveidotu jaucējobjektu.

Tā vietā, lai to darītu, mēs varam izmantot arī sha256() konstruktoru, kā parādīts:

sha256_hash = hashlib.sha256()
message= "pcdream.lt is awesome!"
sha256_hash.update(message.encode())
sha256_hash.hexdigest()
# Output: 'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'

Izvades hash ir identisks jaukšanai, ko ieguvām iepriekš ziņojuma virknei “pcdream.lt ir satriecošs!”.

Hash objektu atribūtu izpēte

Jaucējobjektiem ir daži noderīgi atribūti:

  • Atribūts digest_size apzīmē īssavilkuma lielumu baitos. Piemēram, SHA256 algoritms atgriež 256 bitu jaucēju, kas ir līdzvērtīgs 32 baitiem
  • Atribūts block_size attiecas uz bloka izmēru, ko izmanto jaukšanas algoritmā.
  • Atribūts name ir tā algoritma nosaukums, ko varam izmantot konstruktorā new(). Šī atribūta vērtības meklēšana var būt noderīga, ja jaucējobjektiem nav aprakstošu nosaukumu.

Mēs varam pārbaudīt šos atribūtus iepriekš izveidotajam objektam sha256_hash:

>>> sha256_hash.digest_size
32
>>> sha256_hash.block_size
64
>>> sha256_hash.name
'sha256'

Tālāk apskatīsim dažas interesantas jaukšanas lietojumprogrammas, izmantojot Python hashlib moduli.

Praktiski jaukšanas piemēri

Programmatūras un failu integritātes pārbaude

Kā izstrādātāji mēs visu laiku lejupielādējam un instalējam programmatūras pakotnes. Tas ir taisnība neatkarīgi no tā, vai strādājat ar Linux distribūciju vai operētājsistēmu Windows vai Mac.

Tomēr daži programmatūras pakotņu spoguļi var nebūt uzticami. Jaucējsummu (vai kontrolsummu) varat atrast blakus lejupielādes saitei. Varat arī pārbaudīt lejupielādētās programmatūras integritāti, aprēķinot jaucējkodu un salīdzinot to ar oficiālo jaucējkodu.

  Kā pārvērst Raspbery Pi par Plex serveri

To var attiecināt arī uz failiem jūsu datorā. Pat mazākās izmaiņas faila saturā krasi mainīs jaucējfunkciju. Varat pārbaudīt, vai fails ir mainīts, pārbaudot jaucējkodu.

Šeit ir vienkāršs piemērs. Darba direktorijā izveidojiet teksta failu „mans_fails.txt” un pievienojiet tam saturu.

$ cat my_file.txt
This is a sample text file.
We are  going to compute the SHA256 hash of this text file and also
check if the file has been modified by
recomputing the hash.

Pēc tam varat atvērt failu lasīšanas binārajā režīmā (‘rb’), izlasīt faila saturu un aprēķināt SHA256 jaucējkodu, kā parādīts:

>>> import hashlib
>>> with open("my_file.txt","rb") as file:
...     file_contents = file.read()
...     sha256_hash = hashlib.sha256()
...     sha256_hash.update(file_contents)
...     original_hash = sha256_hash.hexdigest()

Šeit mainīgais original_hash ir faila “my_file.txt” jaucējvērtība tā pašreizējā stāvoklī.

>>> original_hash
# Output: '53bfd0551dc06c4515069d1f0dc715d002d451c8799add29f3e5b7328fda9f8f'

Tagad modificējiet failu „my_file.txt”. Varat noņemt papildu sākuma atstarpi pirms vārda “iet”. 🙂

Vēlreiz aprēķiniet hash un saglabājiet to mainīgajā computed_hash.

>>> import hashlib
>>> with open("my_file.txt","rb") as file:
...     file_contents = file.read()
...     sha256_hash = hashlib.sha256()
...     sha256_hash.update(file_contents)
...     computed_hash = sha256_hash.hexdigest()

Pēc tam varat pievienot vienkāršu apgalvojumu, kas apliecina, vai aprēķinātais_jaucējums ir vienāds ar sākotnējo_jaucējumu.

>>> assert computed_hash == original_hash

Ja fails ir modificēts (kas šajā gadījumā ir taisnība), jums vajadzētu saņemt AssertionError:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

Jaukšanu var izmantot, glabājot sensitīvu informāciju, piemēram, paroles datu bāzēs. Jaukšanu var izmantot arī paroles autentifikācijai, veidojot savienojumu ar datu bāzēm. Apstipriniet ievadītās paroles jaucējkodu, salīdzinot ar pareizās paroles jaucējkodu.

Secinājums

Es ceru, ka šī apmācība palīdzēja jums uzzināt par drošu jaucēju ģenerēšanu, izmantojot Python. Šeit ir norādītas galvenās atziņas:

  • Python hashlib modulis nodrošina lietošanai gatavu vairāku jaukšanas algoritmu ieviešanu. Jūs varat iegūt savā platformā garantēto algoritmu sarakstu, izmantojot hashlib.algorithms_guaranteed.
  • Lai izveidotu jaucējobjektu, varat izmantot vispārīgo konstruktoru new() ar sintaksi: hashlib.new(“algo-name”). Varat arī izmantot konstruktorus, kas atbilst konkrētajiem jaukšanas algoritmiem, piemēram: hashlib.sha256() SHA 256 jaukšanai.
  • Pēc jaukšanas ziņojuma virknes un jaukšanas objekta inicializācijas varat izsaukt jaukšanas objekta metodi update() un pēc tam hexdigest() metodi, lai iegūtu jaucēju.
  • Jaukšana var noderēt, pārbaudot programmatūras artefaktu un failu integritāti, saglabājot sensitīvu informāciju datu bāzēs un veicot citas darbības.

Pēc tam uzziniet, kā Python kodēt nejaušu paroļu ģeneratoru.