Сигурно хеширање са Питхон Хасхлиб-ом

Овај водич ће вас научити како да креирате безбедне хешове користећи уграђену функционалност из Питхон-овог хасхлиб модула.

Разумевање значаја хеширања и начина на који се програмски израчунавају безбедни хешови може бити од помоћи — чак и ако не радите у области безбедности апликација. Али зашто?

Па, када радите на Питхон пројектима, вероватно ћете наићи на случајеве у којима сте забринути због чувања лозинки и других осетљивих информација у базама података или датотекама изворног кода. У таквим случајевима, сигурније је покренути алгоритам хеширања на осетљивим информацијама и сачувати хеш уместо информација.

У овом водичу ћемо покрити шта је хеширање и како се разликује од шифровања. Такође ћемо проћи кроз својства безбедних хеш функција. Затим ћемо користити уобичајене алгоритме хеширања да бисмо израчунали хеш отвореног текста у Питхон-у. Да бисмо то урадили, користићемо уграђени модул хасхлиб.

За све ово и више, хајде да почнемо!

Шта је хеширање?

Процес хеширања узима низ поруке и даје излаз фиксне дужине који се зове хеш. Што значи да је дужина излазног хеша за дати алгоритам хеширања фиксна – без обзира на дужину улаза. Али како се разликује од шифровања?

Код шифровања, порука или обичан текст се шифрују помоћу алгоритма за шифровање који даје шифровани излаз. Затим можемо покренути алгоритам за дешифровање на шифрованом излазу да бисмо вратили низ поруке.

Међутим, хеширање функционише другачије. Управо смо сазнали да је процес шифровања инверзибилан у томе што можете прећи са шифроване поруке на нешифровану поруку и обрнуто.

За разлику од енкрипције, хеширање није инверзибилан процес, што значи да не можемо прећи од хеша до улазне поруке.

Особине хеш функција

Хајде да брзо пређемо на нека својства која хеш функције треба да задовоље:

  • Детерминистички: Хеш функције су детерминистичке. Датој поруци м, хеш од м је увек исти.
  • Отпоран на преимаге: Ово смо већ покрили када смо рекли да хеширање није инверзибилна операција. Својство отпора преимаге наводи да је немогуће пронаћи поруку м из излазног хеша.
  • Отпоран на колизију: Требало би да буде тешко (или рачунарски неизводљиво) пронаћи два различита низа порука м1 и м2 тако да је хеш од м1 једнак хешу од м2. Ово својство се назива отпорност на колизију.
  • Отпоран на другу слику: Ово значи да је с обзиром на поруку м1 и одговарајући хеш м2, немогуће пронаћи другу поруку м2 тако да је хасх(м1) = хасх(м2).
  15 најбољих виџета појмова које можете да додате у своје подешавање

Питхонов хасхлиб модул

Питхон-ов уграђени хасхлиб модул пружа имплементације неколико алгоритама за хеширање и сажетак порука укључујући СХА и МД5 алгоритме.

Да бисте користили конструкторе и уграђене функције из Питхон хасхлиб модула, можете га увести у своје радно окружење на следећи начин:

import hashlib

Хасхлиб модул обезбеђује константе алгоритхмс_аваилабле и алгоритхмс_гуарантеед, које означавају скуп алгоритама чије су имплементације доступне и загарантоване на платформи, респективно.

Према томе, алгоритхмс_гуарантеед је подскуп алгоритхмс_аваилабле.

Покрените Питхон РЕПЛ, увезите хасхлиб и приступите константама алгоритхмс_аваилабле и алгоритхмс_гуарантеед:

>>> 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'}

Видимо да је алгоритхмс_гуарантеед заиста подскуп алгоритхмс_аваилабле

Како направити хеш објекте у Питхон-у

Затим хајде да научимо како да креирамо хеш објекте у Питхон-у. Израчунаћемо СХА256 хеш низа поруке користећи следеће методе:

  • Генерички нев() конструктор
  • Конструктори специфични за алгоритам

Коришћење конструктора нев().

Хајде да иницијализујемо стринг поруке:

>>> message = "techblog.co.rs is awesome!"

Да бисмо инстанцирали хеш објекат, можемо користити конструктор нев() и проследити име алгоритма као што је приказано:

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

Сада можемо позвати метод упдате() на хеш објекту са стрингом поруке као аргументом:

>>> sha256_hash.update(message)

Ако то урадите, наићи ћете на грешку јер алгоритми хеширања могу да раде само са низовима бајтова.

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

Да бисте добили кодирани стринг, можете позвати метод енцоде() на стрингу метода, а затим га користити у позиву методе упдате(). Након што то урадите, можете позвати метод хекдигест() да бисте добили сха256 хеш који одговара низу поруке.

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

Уместо да кодирате стринг поруке користећи енцоде() метод, можете га дефинисати и као низ бајтова тако што ћете стринг ставити префикс са б на следећи начин:

message = b"techblog.co.rs is awesome!"
sha256_hash.update(message)
sha256_hash.hexdigest()
# Output: 'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'

Добијени хеш је исти као претходни хеш, што потврђује детерминистичку природу хеш функција.

  Како да користите „ГПТ помињања“ за позивање прилагођених ГПТ-ова у било којој ЦхатГПТ конверзацији

Поред тога, мала промена у стрингу поруке би требало да изазове драстичну промену хеша (такође познато као „ефекат лавине“).

Да бисмо ово потврдили, променимо ‘а’ у ‘авесоме’ у ‘А’ и израчунајмо хеш:

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

Видимо да се хеш потпуно мења.

Коришћење конструктора специфичног за алгоритам

У претходном примеру користили смо генерички конструктор нев() и пренели „СХА256“ као име алгоритма за креирање хеш објекта.

Уместо да то урадимо, можемо користити и сха256() конструктор као што је приказано:

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

Излазни хеш је идентичан хешу који смо раније добили за стринг поруке „вдзвдз је супер!“.

Истраживање атрибута хеш објеката

Хеш објекти имају неколико корисних атрибута:

  • Атрибут дигест_сизе означава величину сажетка у бајтовима. На пример, СХА256 алгоритам враћа 256-битни хеш, што је еквивалентно 32 бајта
  • Атрибут блоцк_сизе се односи на величину блока која се користи у алгоритму хеширања.
  • Атрибут наме је име алгоритма који можемо да користимо у нев() конструктору. Проналажење вредности овог атрибута може бити од помоћи када хеш објекти немају описна имена.

Можемо да проверимо ове атрибуте за објекат сха256_хасх који смо креирали раније:

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

Затим, погледајмо неке занимљиве апликације хеширања користећи Питхон-ов хасхлиб модул.

Практични примери хеширања

Провера интегритета софтвера и датотека

Као програмери, ми преузимамо и инсталирамо софтверске пакете све време. Ово је тачно без обзира да ли радите на Линук дистрибуцији или на Виндовс-у или Мац-у.

Међутим, нека огледала за софтверске пакете можда нису поуздана. Можете пронаћи хеш (или контролни збир) поред везе за преузимање. И можете да проверите интегритет преузетог софтвера тако што ћете израчунати хеш и упоредити га са званичним хешом.

  Како добити Пхило 7 дана бесплатног пробног периода

Ово се такође може применити на датотеке на вашој машини. Чак и најмања промена у садржају датотеке ће драстично променити хеш, можете проверити да ли је датотека измењена тако што ћете проверити хеш.

Ево једноставног примера. Направите текстуалну датотеку ‘ми_филе.ткт’ у радном директоријуму и додајте јој садржај.

$ 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.

Затим можете отворити датотеку у бинарном режиму читања (‘рб’), прочитати садржај датотеке и израчунати СХА256 хеш као што је приказано:

>>> 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()

Овде је променљива оригинал_хасх хеш ‘ми_филе.ткт’ у свом тренутном стању.

>>> original_hash
# Output: '53bfd0551dc06c4515069d1f0dc715d002d451c8799add29f3e5b7328fda9f8f'

Сада измените датотеку ‘ми_филе.ткт’. Можете уклонити додатни водећи размак испред речи ‘иде’. 🙂

Поново израчунајте хеш и сачувајте га у променљивој цомпутед_хасх.

>>> 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()

Затим можете додати једноставну изјаву ассерт која потврђује да ли је цомпутед_хасх једнак оригинал_хасх-у.

>>> assert computed_hash == original_hash

Ако је датотека измењена (што је тачно у овом случају), требало би да добијете АссертионЕррор:

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

Можете да користите хеширање када чувате осетљиве информације, као што су лозинке у базама података. Такође можете користити хеширање у аутентификацији лозинке када се повезујете са базама података. Потврдите хеш унете лозинке са хешом исправне лозинке.

Закључак

Надам се да вам је овај водич помогао да научите о генерисању безбедних хешова помоћу Питхон-а. Ево кључних закључака:

  • Питхонов хасхлиб модул пружа спремне имплементације неколико алгоритама хеширања. Можете добити листу алгоритама загарантованих на вашој платформи користећи хасхлиб.алгоритхмс_гуарантеед.
  • Да бисте креирали хеш објекат, можете користити генерички конструктор нев() са синтаксом: хасхлиб.нев(“алго-наме”). Алтернативно, можете користити конструкторе који одговарају специфичним алгоритмима хеширања, на пример: хасхлиб.сха256() за СХА 256 хеш.
  • Након иницијализације стринга поруке који треба да се хешује и хеш објекта, можете позвати метод упдате() на хеш објекту, а затим метод хекдигест() да бисте добили хеш.
  • Хеширање може бити корисно када се проверава интегритет софтверских артефаката и датотека, чува осетљиве информације у базама података и још много тога.

Затим научите како да кодирате генератор случајних лозинки у Питхон-у.