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 vagy random a Pythonban
  • Használja a Web Crypto API-t a JavaScript-ben, a crypto-modult a NodeJs-ben és a secrets-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.