A véletlenszerű számok mindenhol megtalálhatók az interneten, és az Ön biztonsága tőlük függ. Lássuk, jól használod-e őket.
A véletlen számok kritikus szerepet játszanak a webalkalmazások biztonságában. Munkamenet-azonosítókban, jelszavakban, kriptográfiai kulcsokban és egyebekben használatosak. Ha azonban nincsenek biztonságosan implementálva, sérülékenységekhez vezethetnek, amelyeket a támadók kihasználva illetéktelenül hozzáférhetnek érzékeny információkhoz.
TLDR
- A legtöbb véletlen generátor nem igazán véletlenszerű. Véletlenszerűnek tűnő matematikát használnak
- Ne használja a
Math.random()
értéket JavaScriptben vagyrandom
a Pythonban - Használja a
Web Crypto API
-t a JavaScript-ben, acrypto
-modult a NodeJs-ben és asecrets
-t a python-ban - Ne próbálja megvalósítani a saját véletlenszerű generáló algoritmusát
- A biztonságos véletlen számok helytelen használata sebezhetővé teheti az alkalmazást
Hogyan működnek a véletlenszerű függvények
Álvéletlen számgenerátorok (PRNG-k)
A PRNG-k az RNG-k leggyakrabban használt típusai. Egy algoritmus segítségével véletlenszerűnek tűnő számsorozatot generálnak. Az algoritmus bemenetként egy kezdeti értéket vesz fel, és ez alapján számsort állít elő.
A PRNG-kben használt általános algoritmusok a "Mersenne-Twister" és a "lineáris kongruenciális generátor (LCG)".
Ezek az algoritmusok egy seed
nevű kezdeti számot kapnak. Megváltoztatják az előző véletlen szám hozzáadásával, eltolással és XOR operátorokkal a kimenet létrehozásához. A kimenet véletlenszerű számnak tűnik, bár ez csak egy képlet kimenete.
Ha továbbra is végrehajt egy PRNG-t, az végül ugyanazokat a számokat generálja újra és újra. Bármely PRNG fix hosszúságú számokkal rendelkezik, amelyek generálhatók az újrakezdés előtt.
Valódi véletlenszám-generátorok (TRNG-k)
A TRNG-k valóban véletlenszerű számokat generálnak fizikai folyamatok alapján, amelyek eredendően véletlenszerűek. E folyamatok közé tartozik a légköri zaj, a radioaktív bomlás és a termikus zaj. A TRNG-k mérik a fizikai folyamatot, és véletlen számmá alakítják át.
Véletlenszerű funkciók sebezhetőségei
Mind a mag-, mind a véletlenszám-generáló algoritmusnak lehetnek gyengeségei.
Előrejelzés
Mondhatni, a kiszámíthatóság a gyenge véletlenszám-generátorok fő sebezhetősége. A PRNG-k eleve megjósolhatók, mivel egy matematikai képleten alapulnak. Tehát ha ismeri a magot és az utolsó véletlenszámot, megjósolhatja a következő véletlenszámot. Ez súlyos sebezhetőségekhez vezethet.
Vegyünk például egy elfelejtett jelszó funkciót, amely egy véletlenszerű tokenen alapul. Ha a token előre jelezhető, a támadó bármely felhasználó jelszavát visszaállíthatja.
Ütközés
A kiszámíthatóság mellett néhány rossz minőségű véletlen generátor nagyon gyakran duplikált értékeket produkál. Ez növelheti az ütközés kockázatát.
Vegyünk egy olyan alkalmazást, amely véletlenszerű munkamenet-tokeneket generál a felhasználók számára. A duplikált munkamenet-tokenek létrehozásának esélye két tényezőtől függ:
- A véletlenszerű terület mérete (a munkamenet token hossza)
- A véletlenszerű kiválasztás minősége
A rövid hosszúságú tokenek nagyobb eséllyel fognak ütközni. A rossz véletlen generátor pedig nem generál minden lehetséges értéket. Ez olyan sérülékenységekhez vezethet, ahol a felhasználó egy másik felhasználó adatait láthatja.
Vetőmag szivárgás vagy manipuláció
A véletlenszám-generátorokkal kapcsolatos másik sebezhetőség a gyenge mag kiválasztása. A PRNG mindig ugyanazt a számsort állítja elő ugyanazzal a kezdeti magértékkel. Ha egy támadó megtalálja a használt magot vagy manipulálja azt, könnyen generálhat ugyanazokat a véletlen számokat.
A gyakorlatban a hackerek különböző módszereket használnak a következő véletlen szám előrejelzésére. Egyes módszerek statisztikai elemzést, míg mások a generátor algoritmusának visszafejtését foglalhatják magukban.
A biztonságos véletlen számok használata
A kriptográfiailag biztonságos véletlenszám-generáló algoritmusok használata a kulcs a véletlen számok biztonságos előállításához. Ezek az algoritmusok véletlen számokat generálnak, amelyek kiszámíthatatlanok, és a támadók nem tudják könnyen kitalálni. Ezeknek az algoritmusoknak a kimenete ellenáll a brute force támadásoknak, és statisztikailag robusztus.
Ne próbálja meg saját algoritmusát megvalósítani, hacsak nem tudja, mit csinál. Ehelyett mindig használjon ismerten biztonságos véletlenszerű könyvtárakat.
Lássunk néhány példát a biztonságos véletlenszerű könyvtárak használatára különböző programozási nyelveken.
JavaScript
A Math.random()
függvény nem alkalmas kriptográfiai célokra, mivel nem igazán véletlenszerű, és a támadó előre jelezheti vagy manipulálhatja.
Biztonságos véletlenszám generálásához JavaScriptben használhatja a Web Crypto API
. A Crypto.getRandomValues()
metódus lehetővé teszi, hogy kriptográfiailag erős véletlenszerű értékeket kapjon. Íme egy példakód, amely biztonságos véletlenszámot generál:
function generateRandomNumber() { const array = new Uint32Array(1); // Create a 32-bit unsigned integer array window.crypto.getRandomValues(array); // Fill the array with random values return array[0]; // Return the first element of the array as the random number } console.log(generateRandomNumber()); // Output a random number between 0 and 4294967295
NodeJS
A NodeJS-ben a crypto
modul kriptográfiailag biztonságos véletlenszámok generálására használható. A következő kódminta szemlélteti a kriptomodulok használatát egy véletlenszám generálására:
const crypto = require('crypto'); function generateRandomNumber() { const randomBytes = crypto.randomBytes(4); // Generate 4 random bytes const hexValue = randomBytes.toString('hex'); // Convert the bytes to a hex string const intValue = parseInt(hexValue, 16); // Convert the hex string to an integer return intValue; } console.log(generateRandomNumber()); // Output a random number between 0 and 4294967295
Piton
A Pythonban a random
modul használható véletlen számok generálására. Ez azonban kriptográfiailag nem biztonságos. Ehelyett használhatja a secrets
modult kriptográfiailag biztonságos véletlenszámok generálására. A következő kódminta szemlélteti a titkok modul használatát véletlen szám generálásakor:
import secrets def generate_random_number(): random_number = secrets.randbits(32) # Generate a 32-bit random number return random_number print(generate_random_number()) # Output a random number between 0 and 4294967295
Következtetés
A számítógépekben a véletlen számok matematikai képletek és kiszámíthatók. Nem minden véletlenszám-generátor alkalmas kriptográfiai és biztonsági felhasználásra. A véletlen számok csak egy elem a biztonsági rendszer tervezésében és megvalósításában. Sok más dolog van, mint például a maggenerálás, a kulcskezelés és a biztonsági rendszer általános tervezése, amelyek rendkívül fontosak és nehezen megoldhatók. A Crypto 101 remek hely a kriptográfiáról való többet megtudni.
További információ a SmartScanner biztonsági blogon.