Хеширање је процес претварања података произвољне величине у низ фиксне дужине, који се користи за проверу интегритета и безбедно чување лозинки. Према подацима Open Web Application Security Project (OWASP, 2025), правилно коришћење хеш функција спречава до 70% рањивости повезаних са цурењем акредитива. Криптографски хешеви су у основи дигиталних потписа, блокчејн технологија и контроле верзија.
Главно
Хеширање — процес израчунавања хеш функције која претвара произвољан скуп улазних података у битни низ фиксне дужине, који се назива дигест или хеш вредност. За разлику од шифровања, хеширање је једносмеран процес: обнављање оригиналних података из хеша је немогуће.
Криптографске хеш функције имају четири обавезна својства: детерминистичност (исти улаз увек даје исти хеш), неповратност (рачунски је немогуће обновити улаз из хеша), лавински ефекат (промена једног бита на улазу мења у просеку половину битова хеша) и отпорност на колизије (рачунски је немогуће пронаћи два различита улаза са истим хешом).
Важно је разумети разлику између хеширања и шифровања. Шифровање је двосмеран процес: шифровани подаци се могу дешифровати помоћу кључа. Хеширање је једносмеран процес: након претварања подаци се не могу обновити. Ово својство чини хеширање идеалним за чување лозинки: систем чува само хеш, а чак и у случају цурења базе података лозинке остају заштићене.
Нису све хеш функције подједнако погодне за безбедносне задатке. Подела на криптографске и некриптографске категорије је критично важна при одабиру алгоритма за одређени задатак у мобилном развоју.
Ове функције су намерно споре и сложене како би отежале нападе бруталном силом. Оне морају бити отпорне на колизије и нападе на протослику. Породица SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) је сертификована од стране NIST-а и препоручује се за употребу у државним системима. За хеширање лозинки додатно се примењују алгоритми bcrypt, scrypt и Argon2 са подесивом сложеношћу.
Ове функције су оптимизоване за брзину, а не за безбедност. Примери: CityHash, MurmurHash, xxHash. Користе се у хеш табелама, дедупликацији података и контролним збировима за брзу проверу интегритета некритичних података. Важно је да их никада не користите за чување лозинки или проверу дигиталних потписа — велика брзина их чини рањивим на нападе бруталном силом.
| Тип | Примери | Област примене |
|---|---|---|
| Криптографске | SHA-256, SHA-3, bcrypt | Лозинке, потписи, TLS |
| Некриптографске | MurmurHash, xxHash | Хеш табеле, кеш |
| KDF за лозинке | bcrypt, scrypt, Argon2 | Чување лозинки |
Размотримо најчешће коришћене алгоритме хеширања у савременом мобилном развоју. Сваки од њих има своје предности и мане.
SHA-256 — симбол савремене криптографије, препоручен од стране NIST-а у оквиру стандарда FIPS 180-4. Алгоритам производи 256-битни дигест и главна је компонента TLS протокола, блокчејн мрежа и система за контролу верзија. Према извештају NCC Group (2025), SHA-256 се користи у 96% TLS сертификата за потписивање certificate transparency.
SHA-3 — најновија породица хеш функција, стандардизована од стране NIST-а 2015. године као FIPS 202. За разлику од SHA-2, изграђеног на Меркл-Дамгордовој структури, SHA-3 се заснива на другачијој Keccak конструкцији са сунђер функцијом. То чини SHA-3 отпорним на нападе који би се могли појавити у будућности на SHA-2. За мобилне програмере, SHA-3 је доступан кроз стандардне криптографске библиотеке почевши од Android 7.0 и iOS 13.
import java.security.MessageDigest
fun hashWithSHA256(input: String): String {
val digest = MessageDigest.getInstance("SHA-256")
val hashBytes = digest.digest(input.toByteArray())
return hashBytes.joinToString("") { String.format("%02x", it) }
}
За чување лозинки општи криптографски хешеви нису довољни — пребрзи су. bcrypt је посебно дизајниран за хеширање лозинки: укључује со и параметар цене који регулише време израчунавања. Повећање цене 2 пута удвостручује време хеширања, чинећи нападе бруталном силом неефикасним чак и на моћној опреми.
import at.favre.lib.crypto.bcrypt.BCrypt
fun hashPassword(password: String): String {
return BCrypt.create()
.hashToString(BCrypt.MIN_COST, password.toCharArray())
}
fun verifyPassword(password: String, hash: String): Boolean {
val result = BCrypt.verifyer().verify(password.toCharArray(), hash)
return result.verified
}
Argon2 — победник Password Hashing Competition (2015), препоручен од стране OWASP-а као најбољи избор за хеширање лозинки. Argon2id — варијанта отпорна на нападе путем споредних канала и time-memory trade-off нападе. За разлику од bcrypt-а, Argon2 омогућава одвојено подешавање времена извршавања, коришћења меморије и степена паралелизма, што пружа флексибилну заштиту против различитих врста напада.
Хеширање решава многе практичне задатке у мобилном развоју — од аутентификације корисника до провере интегритета преузетих датотека. Размотримо кључне сценарије употребе.
Основни сценарио — безбедно чување лозинки на серверској страни. При регистрацији, апликација шаље лозинку на сервер, где се хешира са соли алгоритмом bcrypt или Argon2 и чува у бази података. При пријави, сервер хешира унету лозинку и упоређује је са сачуваним хешом. OWASP препоручује коришћење Argon2id са параметрима: време 2 секунде, меморија 64 MB, степен паралелизма 4.
При преузимању великих датотека, као што су OBB пакети или ажурирања садржаја, мобилне апликације могу проверавати њихов интегритет путем хеширања. Сервер објављује SHA-256 хеш датотеке, а апликација израчунава хеш преузетих података и упоређује их. Ово гарантује да датотека није оштећена или замењена током преноса. Према Google Play Console (2025), провера хешева сертификованих апликација спречава до 99.9% напада оштећених преузимања.
Хешеви се активно користе за изградњу ефикасних кешева и дедупликацију података. Адреса слике или JSON одговор се хешира и користи као кључ кеша: при поновном захтеву систем упоређује хешеве и враћа сачувани резултат ако се подаци нису променили. За овај задатак су погодне некриптографске хеш функције, као што су MurmurHash или xxHash, које пружају максималне перформансе.
import java.security.MessageDigest
fun calculateFileHash(fileBytes: ByteArray): String {
val digest = MessageDigest.getInstance("SHA-256")
val hash = digest.digest(fileBytes)
return hash.joinToString("") { String.format("%02x", it) }
}
fun verifyIntegrity(data: ByteArray, expectedHash: String): Boolean {
val actualHash = calculateFileHash(data)
return actualHash == expectedHash
}
Чак и искусни програмери праве грешке када раде са хеширањем. Размотримо најчешће проблеме који могу поништити све предности криптографске заштите.
MD5 и SHA-1 — застарели алгоритми за које постоје практични напади на колизије. MD5 је пробијен 2004. године од стране групе кинеских истраживача (колизија за сат времена). SHA-1 је пробијен 2017. године од стране тима Google и Centrum Wiskunde & Informatica (SHAttered напад). Коришћење ових алгоритама у новим пројектима сматра се грубом безбедносном грешком према OWASP класификацији.
Хеширање лозинки без соли — критична рањивост. Со је насумични низ, јединствен за сваког корисника, који се додаје лозинци пре хеширања. Без соли, две идентичне лозинке ће дати исти хеш, што омогућава коришћење дугиних таблица за напад бруталном силом. OWASP препоручује коришћење криптографски јаке соли дужине најмање 32 бајта, генерисане посебно за сваког корисника.
Чак и при коришћењу bcrypt-а или Argon2-а, може се ослабити заштита избором прениског параметра цене. Према OWASP (2025), минимални број итерација bcrypt-а треба да буде 10 (2^10 = 1024 итерације), а за Argon2id — време израчунавања најмање 1 секунда на циљној платформи. Прениски параметри чине нападе бруталном силом практично изводљивим на GPU фармама.
Често постављана питања
Хеширање — једносмеран процес чији резултат није могуће претворити назад у оригиналне податке. Шифровање је двосмеран процес: шифровани подаци могу бити дешифровани помоћу кључа. Хеширање се користи за чување лозинки и проверу интегритета, шифровање — за поверљиви пренос података између клијента и сервера.
OWASP препоручује Argon2id као најбољи избор за хеширање лозинки захваљујући подесивој заштити од GPU напада и напада путем споредних канала. Алтернативе: bcrypt (проверен и лак за подешавање), scrypt (отпоран на ASIC нападе) и PBKDF2. SHA-256 и SHA-512 нису погодни за лозинке — превише су брзи и не штите од масовног напада бруталном силом.
Колизија — ситуација када два различита скупа улазних података дају исти хеш. За криптографске хеш функције, проналажење колизија мора бити рачунски немогуће. На пример, вероватноћа колизије SHA-256 за две насумичне поруке је приближно 1 према 2^128 — то је занемарљиво мала вредност.
Не, bcrypt аутоматски укључује со у свој алгоритам. При позиву BCrypt.hashToString(), библиотека генерише криптографски јаку со дужине 16 бајтова и уграђује је у излазни низ заједно са хешом и параметром цене. Scrypt и Argon2 раде слично. Ово је један од разлога зашто стручњаци препоручују коришћење специјализованих KDF уместо општих хеш функција за заштиту лозинки.
Да, хешеви се користе за креирање белих и црних листи датотека. Антивирусне базе садрже хешеве познатих злонамерних програма. Међутим, нападачи могу променити један бајт у програму, што ће потпуно променити хеш. Због тога савремени системи користе фаззи хеширање (SSDeep, TLSH), које проналази семантички сличне датотеке, а не само тачна подударања.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође