Titkosítás PHP-ben. Adatok titkosítása, visszafejtése kulcs segítségével a PHP titkosítási és hitelesítési kulcsaiban

  • Fordítás
  • oktatóanyag

A fordítótól: a programozás során soha nem felejtem el, hogy veszélyesen alkalmatlan vagyok a kriptográfiában, és mindenkinek azt tanácsolom, hogy folytassa ebből a tézisből (na jó, talán kivéve téged és azt a menő srácot ott). A munka során azonban így vagy úgy adatvédelemmel kapcsolatos problémák merülnek fel, amelyeket meg kell oldani. Ezért figyelmébe ajánlom Timo H finn fejlesztő cikkének fordítását, amelyet meglehetősen érdekesnek és hasznosnak találtam.

Ez egy gyors útmutató arról, hogyan lehet elkerülni a gyakori buktatókat a PHP szimmetrikus titkosításával.

Figyelembe vesszük azt az esetet, amikor az adatok feldolgozása a szerver oldalon történik (különösen a titkosítás történik a szerveren, és az adatok például a klienstől átvehetők egyértelmű szöveg, jelszó stb. formájában), ami a PHP alkalmazások tipikus esete .

Az ebben az útmutatóban található információk nem használhatók bonyolultabb követelményeket támasztó titkosított hálózati kapcsolatok létrehozására. Ilyen esetekben kém vagy TLS-t kell használnia.

Természetesen az itt megadott ajánlások nem az „egyetlen lehetséges módja” a titkosítás megszervezésének PHP-ben. Ennek az útmutatónak az a célja, hogy megpróbáljon kevesebb teret hagyni a hibáknak és a nehéz, kétértelmű döntéseknek.

Titkosító funkciók PHP-ben

Használjon Mcrypt vagy OpenSSL kiterjesztést.

Titkosító algoritmus és működési módja, egyszeri kód (inicializálási vektor)

Az AES-256 használata CTR módban véletlenszerű egyszeri kóddal ( kb. fordítás: nonce). Az AES szabvány, így bármelyik kiterjesztés funkcióját használhatja - Mcrypt vagy OpenSSL.

Mindig hozzon létre egy új egyszeri kódot. Ebben az esetben kriptográfiailag biztonságos véletlenszám-forrást kell használnia. Olvasson egy kicsit többet a véletlenszámok generálásáról alább. Az egyszeri kód nem titok, és titkosított szöveggel összefűzhető az átvitelhez és az azt követő visszafejtéshez.

Az egyszeri kódnak 128 bitesnek (16 bájtnak) kell lennie, csak egy bájtból álló karakterláncnak, kódolás nélkül.

Az Mcrypt kiterjesztésben az AES Rijndael-128 néven ismert ( kb. ford.: annak ellenére, hogy AES-256-ról beszélünk, ez nem hiba. AES-256 != Rijndael-256). OpenSSL-ben, illetve AES-256-CTR.

Példa az Mcrypt használatára:
OpenSSL példa:
Ellenőrizze, hogy a titkosítás megfelelően működik-e tesztvektorok segítségével ( kb. fordítás: az AES-256-CTR-hez lásd az F.5.5 bekezdést az 57. oldalon).

A CTR módban bizonyos korlátozások vonatkoznak a titkosított adatok teljes mennyiségére. Lehet, hogy a gyakorlatban nem találkozik ezzel, de ne feledje, hogy egy kulccsal nem szabad 2^64 bájtnál többet titkosítani, függetlenül attól, hogy egy hosszú üzenetről van szó, vagy sok rövidről.

A CTR mód csak akkor marad stabil, ha nem ugyanazt az egyszeri kódot használja ugyanazzal a kulccsal. Emiatt fontos az egyszeri kódok generálása a kriptográfiailag erős véletlenszerű forrás felhasználásával. Ezenkívül ez azt jelenti, hogy egyetlen kulccsal nem szabad 2^64 üzenetnél többet titkosítani. Mivel az egyszeri kód hossza 128 bit, az üzenetek számának (és a hozzájuk tartozó egyszeri kódoknak) 2^128/2-es korlátja fontos a születésnapi paradoxon miatt ( kb. fordítás:).

És ne feledje, hogy a titkosítás nem fogja elrejteni azt a tényt, hogy mennyi adatot küld. Példaként egy szélsőséges esetre, ha csak "igen" vagy "nem"-et tartalmazó üzeneteket titkosít, a titkosítás nyilvánvalóan nem fogja elrejteni ezeket az információkat.

Adathitelesítés

Mindig ellenőrizze az adatok hitelességét és sértetlenségét.
Ehhez használja a MAC-ot a titkosítás után. Azok. Először az adatokat titkosítják, majd a HMAC-SHA-256-ot veszik a kapott titkosított szövegből, beleértve magát a rejtjelezett szöveget és az egyszeri kódot.

A visszafejtés során először ellenőrizze a HMAC-t egy olyan összehasonlító algoritmus segítségével, amely ellenáll az időzítési támadásoknak. Ne hasonlítsa össze közvetlenül a $user_submitted_mac és a $calculated_mac elemet az == vagy === összehasonlító operátorok használatával. Még jobb a „HMAC kettős ellenőrzés” használata.

Ha a HMAC ellenőrzés sikeres, a visszafejtés biztonságosan elvégezhető. Ha a HMAC nem megfelelő, azonnal állítsa le.

Titkosítási és hitelesítési kulcsok

Ideális esetben olyan kulcsokat használjon, amelyek kriptográfiailag erős véletlenszerű forrásból származnak. Az AES-256 32 bájt véletlenszerű adatot igényel (egy „nyers” karakterlánc – kódolás nélküli bitsorozat).

Ha az alkalmazás 5.5 alatti PHP verzió alatt fut, amely nem rendelkezik beépített PBKDF2 implementációval, akkor saját PHP-beli implementációt kell használnia, amelyre egy példa itt található: https://defuse. ca/php-pbkdf2.htm. Ne feledje, hogy a saját megvalósítására hagyatkozva előfordulhat, hogy a kulcsot nem oldja fel megfelelően, ahogy a beépített hash_pbkdf2() függvény teszi.

Ne használja ugyanazt a kulcsot titkosításhoz és hitelesítéshez. Mint fentebb említettük, 32 bájt szükséges a titkosítási kulcshoz és 32 bájt a hitelesítési kulcshoz (HMAC). A PBKDF2-vel 64 bájtot vehet ki a jelszóból, és mondjuk az első 32 bájtot használhatja titkosítási kulcsként, a maradék 32 bájtot pedig hitelesítési kulcsként.

Ha jelszavait fájlban tárolja, például HEX karakterláncként, ne kódolja újra azokat, mielőtt betáplálja őket a titkosítási funkciókba. Ehelyett használja a PBKDF2-t, hogy a HEX-kódolású kulcsokat közvetlenül jó minőségű titkosítási vagy hitelesítési kulccsá alakítsa. Vagy használja az SHA-256-ot további kódolási kimenet nélkül (csak egy 32 bájtos karakterlánc) a jelszavak kivonatához. A rendszeres jelszókivonat használata elegendő entrópiát biztosít. További részletek a következő bekezdésekben találhatók.

Kulcs nyújtás

Először is kerülje az alacsony entrópiájú kulcsok használatát. De mégis, ha például felhasználói jelszavakat kell használnia, akkor feltétlenül a PBKDF2-t kell használnia nagy számú iterációval a kulcsbiztonság maximalizálása érdekében.

A PBKDF2 egyik paramétere a hash iterációk száma. És minél magasabb, annál nagyobb a kulcs biztonsága, amelyre számíthat. Ha kódja 64 bites platformon fut, használja az SHA-512-t a PBKDF2 kivonatolási algoritmusaként. 32 bites platform esetén használja az SHA-256-ot.

Az online alkalmazásokban azonban nem lehetséges viszonylag sok iterációt használni a DoS támadás kockázata miatt. Ezért a kulcsminőség nem lesz olyan magas, mint az offline alkalmazásokban, amelyek nagyszámú iterációt engedhetnek meg maguknak ilyen kockázat nélkül. Általános szabály, hogy az online alkalmazásokhoz olyan számú hash iterációt választanak ki, hogy a PBKDF2 ne tartson tovább 100 ms-nál.

Abban az esetben, ha használhat nagy entrópiájú jelszavakat, nem szükséges kinyújtani, mint az alacsony entrópiájú jelszavak esetében. Például, ha létrehoz egy "titkosítási_mester_kulcsot" és egy "auth_master_key"-t a /dev/urandom használatával, akkor egyáltalán nincs szükség PBKDF2-re. Csak ügyeljen arra, hogy a kulcsokat bitsorozatként használja, kódolás nélkül.

Ezenkívül a PBKDF2-vel nem nehéz egyetlen fő jelszóból titkosítási és hitelesítési kulcsokat is megszerezni (csak kevés iterációt, vagy akár egyet is használjon). Ez akkor hasznos, ha csak egy „fő jelszót” használ mind a titkosításhoz, mind a hitelesítéshez.

Kulcstárolás és -kezelés

A legjobb megoldás egy külön dedikált kulcstároló eszköz (HSM) használata.

Ha ez nem lehetséges, akkor a támadás bonyolításához használhatja a kulcsfájl vagy konfigurációs fájl (amely a tényleges titkosítási/hitelesítési kulcsokat tárolja) titkosítását egy külön helyen (a kezdőkönyvtáron vagy a webhely gyökérkönyvtárán kívül) tárolt kulccsal. . Használhat például egy Apache környezeti változót a httpd.conf fájlban a tényleges kulcsfájl visszafejtéséhez szükséges kulcs tárolására:
SetEnv keyfile_key crypto_strong_high_entropy_key # Ezt a változót PHP-ben a $_SERVER["keyfile_key"] segítségével érheti el. # A konfiguráció többi része
Most, ha a webhely gyökerében és az alatta lévő fájlok, beleértve a kulcsokat tartalmazó fájlokat is, veszélybe kerülnek (például ha egy biztonsági másolat kiszivárog), a titkosított adatok biztonságban maradnak, mivel a környezeti változóban tárolt kulcs nem sérült. Fontos megjegyezni, hogy a httpd.conf fájlokról külön kell biztonsági másolatot készíteni, és nem szabad veszélyeztetni a keyfile_key változót például a phpinfo() kimenetén keresztül.

Ha konfigurációs paraméter helyett fájlt használ, lehetséges a kulcsforgatás megszervezése. A legrosszabb esetben, ha egy ellenfél észrevétlenül megszerezte az Ön titkosítási és hitelesítési kulcsait, akkor a kulcsok bizonyos időközönkénti elforgatása korlátozhatja a hozzáférést (feltételezve, hogy nem szerezhet új kulcsokat). Ez a technika segít csökkenteni a sebzést, mivel az ellenség nem tudja a végtelenségig használni a feltört kulcsokat.

Adattömörítés

Általában nem szabad tömöríteni a forrásszöveget a titkosítás előtt. Ez további elemzési eszközt adhat az ellenségnek.

Például, ha a munkamenet adatait titkosított cookie-kban tárolja, amelyek egy része a felhasználó által biztosított, és amelyek egy része titkos információkat képvisel, az ellenfél további információkat tudhat meg a titokról úgy, hogy közönséges felhasználóként elküld néhány speciálisan kialakított adatot és mérjük, hogyan változik a kapott titkosított szövegek hossza.

A szöveget hatékonyabban tömöríti a rendszer, ha vannak ismétlődő területek. A felhasználói adatok manipulálásával kiválaszthatja azokat úgy, hogy részben egybeessen a titkos adatokkal. Minél nagyobb az egyezés, annál kisebb a kimeneti rejtjelezett szöveg. Ezt a fajta támadást BŰNÖKNEK nevezik.

Ha nincs nagy szüksége az adatok tömörítésére, ne tömörítse azokat.

Szerver környezet

Általános szabály, hogy ne tároljon biztonsági szempontból érzékeny alkalmazásokat megosztott kiszolgálón. Például megosztott tárhelyen, ahol az ellenfél hozzáférhet egy virtuális géphez ugyanazon a fizikai szerveren, mint te.

Különféle okok miatt a megosztott kiszolgálók kétes hellyé válnak a biztonság szempontjából kritikus alkalmazások tárolására. Például a közelmúltban virtuális szerverek közötti támadásokat mutattak be: eprint.iacr.org/2014/248.pdf. Ez jó emlékeztető arra, hogy a támadó technikák nem romlanak, hanem idővel csiszolódnak és javulnak. Az ilyen buktatókat mindig figyelembe kell venni.

Szakértői konzultáció

Végül, de nem utolsósorban forduljon szakértőhöz a biztonsági kód áttekintése érdekében.

(PHP 4, PHP 5, PHP 7)

crypt – Egyirányú karakterlánc-kivonat

Figyelem

Ez a funkció (még) nem biztonságos!

Leírás

kripta (string $str [, húr $só]): húr

kripta() kivonatolt karakterláncot ad vissza a szabványos Unix DES-alapú algoritmus vagy a rendszeren elérhető alternatív algoritmusok használatával.

A só paraméter nem kötelező. Azonban, kripta() gyenge hash-t hoz létre a só nélkül. A PHP 5.6 vagy újabb verziója E_NOTICE hibát jelez anélkül is. Ügyeljen arra, hogy a nagyobb biztonság érdekében elég erős sót adjon meg.

jelszó_hash() erős hash-t használ, erős sót generál, és automatikusan alkalmazza a megfelelő köröket. jelszó_hash() egy egyszerű kripta() burkoló és kompatibilis a meglévő jelszókivonatokkal. Használata jelszó_hash() bátorítják.

Egyes operációs rendszerek egynél több típusú hash-t támogatnak. Valójában néha a szabványos DES-alapú algoritmust egy MD5-alapú algoritmus váltja fel. A hash típust a só argumentum váltja ki. Az 5.3 előtt a PHP telepítéskor meghatározta az elérhető algoritmusokat a rendszer crypt() függvénye alapján. Ha nincs megadva só, a PHP automatikusan generál egy szabványos kétkarakteres (DES) sót, vagy egy tizenkét karaktert ( MD5), az MD5 crypt() elérhetőségétől függően. A PHP beállít egy named konstanst CRYPT_SALT_LENGTH amely a rendelkezésre álló hashek által megengedett leghosszabb érvényes sót jelzi.

A szabványos DES-alapú kripta() a sót adja vissza a kimenet első két karaktereként. Ezenkívül csak az str első nyolc karakterét használja, így az ugyanazzal a nyolc karakterrel kezdődő hosszabb karakterláncok ugyanazt az eredményt generálják (ha ugyanazt a sót használjuk).

Azokon a rendszereken, ahol a crypt() függvény több hash-típust támogat, a következő állandók 0-ra vagy 1-re vannak állítva attól függően, hogy az adott típus elérhető-e:

  • CRYPT_STD_DES- Szabványos DES-alapú hash két karakteres sóval a "./0-9A-Za-z" ábécéből. Ha érvénytelen karaktereket használ a sóban, a crypt() sikertelen lesz.
  • CRYPT_EXT_DES- Kiterjesztett DES-alapú hash. A "salt" egy 9 karakterből álló karakterlánc, amely egy aláhúzásból áll, amelyet 4 bájt iterációs szám és 4 bájt só követ. Ezek nyomtatható karakterekként vannak kódolva, karakterenként 6 bit, a legkisebb jelentőségű karakter először. A 0-tól 63-ig terjedő értékek "./0-9A-Za-z"-ként vannak kódolva. Ha érvénytelen karaktereket használ a sóban, a crypt() sikertelen lesz.
  • CRYPT_MD5- MD5 kivonat tizenkét karakteres sóval, 1$-tól kezdődően
  • CRYPT_BLOWFISH- Blowfish hash sóval a következőképpen: "$2a$", "$2x$" vagy "$2y$", egy kétjegyű költségparaméter, "$" és 22 karakter a "./0-9A- ábécéből". Za-z". Ezen a tartományon kívüli karakterek használata a sóban azt eredményezi, hogy a crypt() nulla hosszúságú karakterláncot ad vissza. A kétjegyű költségparaméter az alapul szolgáló Blowfish-alapú kivonatoló algoritmus iterációs számának bázis-2-es logaritmusa, és 04-31 tartományban kell lennie, az ezen a tartományon kívüli értékek a crypt() sikertelenségét okozzák. A PHP 5.3.7 előtti verziói csak a "$2a$" előtagot támogatják: a PHP 5.3.7 bevezette az új előtagokat, hogy kijavítsák a Blowfish implementáció biztonsági hiányosságait. Kérjük, tekintse meg a biztonsági javítás részleteit, de összefoglalva, a csak PHP 5.3.7-et és újabb verziót célzó fejlesztőknek a "$2y$" értéket kell használniuk a "$2a$" helyett.
  • CRYPT_SHA256- SHA-256 hash egy tizenhat karakteres só előtaggal, 5 dollárral. Ha a sófüzér a következővel kezdődik: "rounds=
  • CRYPT_SHA512- SHA-512 hash egy tizenhat karakteres só előtaggal 6 $. Ha a sófüzér a következővel kezdődik: "rounds= $", az N numerikus értéke annak jelzésére szolgál, hogy a hash ciklust hányszor kell végrehajtani, hasonlóan a Blowfish költségparaméteréhez. A körök alapértelmezett száma 5000, minimum 1000 és maximum 999 999 999. Az N ezen a tartományon kívüli kiválasztása a legközelebbi határértékre csonkolva lesz.

A PHP 5.3.0-tól kezdve a PHP saját implementációt tartalmaz, és ezt fogja használni, ha a rendszer nem támogatja egy vagy több algoritmust.

Paraméterek

A kivonatolni kívánt karakterlánc.

Vigyázat

Használni a CRYPT_BLOWFISH algoritmus, az str paramétert legfeljebb 72 karakter hosszúságúra csonkolja.

Opcionális sófüzér a hashelés alapjául. Ha nincs megadva, a viselkedést az algoritmus implementációja határozza meg, és váratlan eredményekhez vezethet.

Visszatérési értékek

A kivonatolt karakterláncot vagy egy 13 karakternél rövidebb karakterláncot ad vissza, és hiba esetén garantáltan eltér a sótól.

Figyelem

A jelszavak érvényesítése során olyan karakterlánc-összehasonlító funkciót kell használni, amely nem érzékeny az időzítési támadásokra. kripta() a korábban ismert hash-hez. A PHP 5.6-tól kezdve biztosítja hash_equals() erre a célra.

Változási napló

Változat Leírás
5.6.5 Ha a "*0" hibakarakterláncot sóként adják meg, a "*1" visszaadásra kerül a többi kriptamegvalósítással való konzisztencia érdekében. Ezt a verziót megelőzően a PHP 5.6 helytelenül adott vissza egy DES hash-t.
5.6.0 E_NOTICE biztonsági figyelmeztetés emelése, ha kihagyja a sót.
5.5.21 Ha a "*0" hibakarakterláncot sóként adják meg, a "*1" visszaadásra kerül a többi kriptamegvalósítással való konzisztencia érdekében. Ezt a verziót megelőzően a PHP 5.5 (és a korábbi ágak) helytelenül adtak vissza egy DES hash-t.
5.3.7 Hozzáadva $2x$és $2y$ Blowfish módok a potenciális nagy bites támadások kezelésére.
5.3.2 SHA-256 és SHA-512 kripta hozzáadva Ulrich Drepper » implementációja alapján.
5.3.2 Javítottuk a Blowfish viselkedését az érvénytelen köröknél, és a "sikertelen" karakterláncot ("*0" vagy "*1") adja vissza, ahelyett, hogy visszatérne a DES-hez.
5.3.0 A PHP most már tartalmazza a saját megvalósítását az MD5 crypt, a Standard DES, az Extended DES és a Blowfish algoritmusokhoz, és ezt fogja használni, ha a rendszer nem támogatja egy vagy több algoritmust.

Példák

1. példa kripta() példák

$hashed_password = crypt("saját jelszó"); // a só automatikusan generálódik

/* A crypt() teljes eredményét át kell adni az összehasonlításhoz
jelszót, hogy elkerülje a problémákat, ha különböző kivonatolási algoritmusokat használnak. (Mint
fentebb azt írja, hogy a szabványos DES-alapú jelszókivonat 2 karakteres sót használ,
de az MD5-alapú hashelés 12-t használ.) */
if (hash_equals ($hashed_password , crypt ($user_input , $hashed_password )))) (
echo "Jelszó ellenőrizve!" ;
}
?>

2. példa Használata kripta() htpasswd-vel

// Állítsa be a jelszót
$password = "saját jelszó" ;

// Szerezze be a hash-t, és hagyja, hogy a só automatikusan létrejöjjön
$hash = crypt($jelszó);
?>

3. példa Használata kripta() különböző hash típusokkal

/* Ezek a sók csak példák, és nem használhatók szó szerint a kódban.
Minden jelszóhoz külön, megfelelően formázott sót kell létrehoznia.
*/
if (CRYPT_STD_DES == 1 ) (
echo "Standard DES: " . kripta ("rasmuslerdorf" , "rl") . "\n" ;
}

if (CRYPT_EXT_DES == 1 ) (
echo "Bővített DES: " . kripta ("rasmuslerdorf" , "_J9..rasm" ) . "\n" ;
}

if (CRYPT_MD5 == 1 ) (
echo "MD5: " . kripta ("rasmuslerdorf" , "$1$rasmusle$" ) . "\n" ;
}

if (CRYPT_BLOWFISH == 1 ) (
echo "Blowfish:" . crypt("rasmuslerdorf", "$2a$07$usesomesillystringforsalt$") . "\n" ;
}

if (CRYPT_SHA256 == 1 ) (
echo "SHA-256: " . crypt("rasmuslerdorf", "$5$rounds=5000$usesomesillystringforsalt$") . "\n" ;
}

if (CRYPT_SHA512 == 1 ) (
echo "SHA-512: " . crypt("rasmuslerdorf", "$6$rounds=5000$usesomesillystringforsalt$") . "\n" ;
}
?>

Bármilyen információ titkosítható vagy visszafejthető, beleértve a PHP használatát is. Ez a nyelv számos adattitkosítási képességgel rendelkezik, az egyszerűtől a bonyolultig.

Nézzük meg az alapvető titkosítási módszereket

alap64- lehetővé teszi az adatok titkosítását és visszafejtését a MIME base64 algoritmus használatával. Nem használ kulcsokat, és gyakran használják a hivatkozások elrejtésére a PHP-ben.

Példák:
//titkosítja a szöveget
$text = "Link";
echo base64_encode($szöveg); //Készül: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==
//dekódolás
echo base64_decode("PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==");
?>

Amint láthatja, először a base64_encode műveletet használtuk, és megkaptuk a titkosítást: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==, majd behelyettesítette a base64_decode-ba, és visszakapta a hivatkozást.

md5- lehetővé teszi az adatok egyoldalú kivonatolását. Ez azt jelenti, hogy a base64-el ellentétben többé nem tudja visszafejteni őket. Gyakran az md5-öt használják a jelszavak adatbázisban való tárolására, de az utóbbi időben a titkosított md5 kombináció könnyen megtalálható a visszafejtési táblázatokban, amelyet számos webhely és algoritmus kínál. Ezért az md5 jelszavak tárolásához jobb az algoritmusokat Blowfish-re cserélni.

Példa:

//titkosítja a szöveget
echo md5("kombináció");
?>

Kulcs titkosítás

És a titkosítás/dekódolás utolsó példája, amelyről beszélni akartam, kulcsot használ (jelszóként). Azaz egyedi kulcsot ad át a titkosítási funkciónak, és ezzel együtt a kód is titkosításra kerül. A visszafejtéshez meg kell adnia a funkciót a titkosított kóddal és egy olyan kulccsal, amelyet csak Ön ismer. Példa a kód alján található függvények használatára.

függvény __encode($text, $key) (



$enc_text=base64_encode(mcrypt_generic($td,$iv.$szöveg));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $enc_text; ) )
függvény strToHex($string) (
$hex="";
for ($i=0; $i< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
return $hex; )
függvény __decode($text, $key) (
$td = mcrypt_module_open("tripledes", "", "cfb", "");
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
if (mcrypt_generic_init ($td, $kulcs, $iv) != -1) (
$decode_text = substr(mdecrypt_generic($td, base64_decode($text)),$iv_size);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $decode_text; ) )
függvény hexToStr($hex) (
$string="";
for ($i=0; $i< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
return $string; )

$str = "Titkosítani szükséges zsemlék!
Kulccsal";
$kód = strToHex(__encode($str, "My#key-do-36-simvolov"));
echo "Titkosított kód: ".$code."
";

$str = __decode(hexToStr($kód), "My#key-do-36-simvolov");
echo "Dekódolt kód: ".$str."
";
?>

Titkosíthatja a html tartalmat. A kulcs hossza legfeljebb 36 karakter lehet.

Ezzel a módszerrel bizonyos adatok titkosíthatók, txt fájlba vagy adatbázisba helyezhetők, illetve kulcsos visszafejtéssel fogadhatók.

Természetesen bármilyen kód visszafejthető/feltörhető, és ez sem kivétel, ezért használj erős titkosítási módszereket.

A kriptográfia egyik alapigazsága, hogy ezen a területen ne találj fel semmit, ha nem vagy profi. Ez részben igaz, mert a legjobbat már régóta feltalálták, elszenvedték és évtizedek óta használják az informatika területén. Az igazság másik oldala az, hogy egy bizonyos tudásterület fejlődése csak a friss ötletek és eredeti megoldások állandó beáramlása mellett valósul meg.

Nyilvánvaló okokból nem az ipari kriptográfia olyan óriásait veszik célba, mint az AES, hanem úgyszólván belemerülünk saját kriptográfiai kutatásainkba blackjackkel és örömmel.

Részben azért, mert érdekes, részben azért, mert egy saját modellezéssel és az elismert szabványokkal való összehasonlításával tisztán látja a kontrasztot, a hatékony megoldásokat és az egyenes kihagyásokat, és megérti, mire lehet törekedni a hatékonyság növelése érdekében.

De már elég víz.

Tegyük fel, hogy a webalkalmazásunk PHP-ben van írva, reverzibilis titkosítást igényel, és úgy gondoljuk, hogy meg tudjuk írni a saját rejtjelező rendszerünket.

Tehát írjunk egy saját reverzibilis titkosítási rendszerünket privát és nyilvános kulccsal, amely egy többé-kevésbé biztonságos kriptográfiai algoritmus következő jellemzőivel rendelkezik:

  1. Zajszimbólumok jelenléte a végső titkosításban.
  2. Az egyes küldő-célállomás csatornákban lévő információk titkosításra kerülnek egy privát kulccsal, és az illesztési funkció minden kulcsnál egyedi lesz.
  3. Minden üzenet egy kivonatkódot kap – egy egyedi kódot, amely a privát kulcs és az eredeti üzenet függvénye. Ez szükséges a "forrásszimbólum" illesztési funkció egyediségének eléréséhez<=>kódolt szimbólum” nem csak a „Küldő-Fogadó” csatornához, hanem minden egyes üzenethez is.

    Így még ha elképzeljük is, hogy egy adott üzenet kódolt és eredeti szimbólumainak egyezése kriptográfiai elemzés, például frekvenciaelemzés segítségével vált ismertté, ez nem ad semmilyen preferenciát egy másik üzenet tanulmányozása során.

  4. A frekvenciaelemzés bonyolítása érdekében minden kezdeti üzenetszimbólumot két rejtjellel kódolunk.
Szóval mi történt.

Sőt, láthatod a végeredményt

A SymCoder osztály titkosítási és visszafejtési módszereket tartalmaz.

A titkosítást a code() metódus végzi, amely az eredeti üzenetet veszi be bemenetként.

Itt a tab_coded-ban generált megfelelési táblázatból származó üzenet egy titkosított üzenetet hoz létre, amelyet a széleken és belül zajszimbólumokkal hígítanak.

A zajszimbólumok egyébként minden küldő-cél csatornánál egyediek, mivel a csatornakulcs segítségével jönnek létre, de az üzeneteknél nem egyediek. A code_symbols-ban a titkosításhoz használt szimbólumok írásjelek és szimbólumok, például %, @ stb.

Minden kódolt szimbólumhoz két szimbólum tartozik a code_symbolsból, nyilvánvaló okokból, hogy többször kevesebb van belőlük, mint a kódolt szimbólumok.

A create_tab_coded megfelelési tábla az üzenetkulcs-kivonat tömbbé történő fordításával épül fel, amelynek elemeinek száma megegyezik a kódszimbólum tömb elemeinek számával. A kétkarakteres kódok bejárásának kezdőpozíciója is mindig más, és a csatornakulcshoz kapcsolódik. Ez lehetővé teszi, hogy megbizonyosodjunk arról, hogy a kódolt szimbólumok bejárására és a kódszimbólumok hozzáillesztésére szolgáló algoritmus mindig (vagy garantáltan gyakran) más lesz.

Például a „hello world” üzenet kódolva így néz ki:

Digest-a00bf11d-&?==&!&?.@.@=!=-.?&1.#&?=:.:.1%!&-%@&@%~&1^#=?%% .!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!

És itt ugyanaz az üzenet, újra kódolva:

Digest-a00bf11d-=:.?=:&!.?.1&-=:=?.?.=.?.!&=%!=-%@=!%~.=^#.1%%. !%+=:.~.@..==%&&1%~.1%@=?.@.!&=.!&@=:&1.==:=!.1&:

Látható, hogy ugyanannak az üzenetnek a kivonata ugyanaz, de a titkosítás más lesz - a zajszimbólumok tetszőleges egyezésben és tetszőleges sorrendben kerülnek hozzáadásra minden egyes új titkosításhoz.

Az üzenetek redundanciával rendelkeznek, ami az üzenet hangerejének növekedésével csökken, legfeljebb 10% zaj (a legrövidebb üzeneteknél a zaj eléri a 90% vagy magasabb százalékot), a titkosított üzenet minimális hossza 116 karakter. Ennek a titkosítási módszernek az egyik hátránya, hogy a kódolt üzenetek száma legalább megkétszereződik.

A dekódolás a „kódszimbólum” forma fordított fordításából áll - az eredeti szimbólum az üzenetből kivágott zajjal. Mi lehet a kulcs? Alapvetően bármilyen karakterlánc, amely egyedi minden cél-vevő párhoz.

Például, ha üzenettitkosítással hoz létre messengert, akkor a privát kulcs legegyszerűbb verziója lehet md5($user_id_1. $salt. $user_id_2), akkor a kulcs minden üzenetcsatornához egyedi lesz.

Tegyük fel, hogy adatokat kell cserélnie két szerver között. Az adatok lehallgatástól való védelme érdekében az adatok titkosítva vannak. Nos, például műveletek átvitele botneten belül. Ez az, ami lényegében nem titkosítás, hanem kódolásnak hívják, és az ilyen kódok dekódolására jól ismert függvényeket használnak.

Az áltitkosítás másik példájaként a jelszavak „titkosítására” adok egy példát egy CMS adatbázisában - ott a jelszavakat nem md5() vagy , hanem egyszerűen a base64-en keresztül kódolják. Azok. Ha az adatbázis kiszivárog, a hackernek nem lesz nehéz az összes jelszó visszafejtése a beépített PHP base64_decode() függvény segítségével.

Adatokat kell továbbítanunk anélkül, hogy aggódnánk, hogy valaki képes lesz elfogni a szöveget és visszafejteni. A PHP-nek van egy népszerű adattitkosítási csomagja, az Mcrypt, amely kétirányú titkosítást (vagyis az adatok tényleges titkosítását és visszafejtését) biztosítja.

Az Mcrypt 2.4.7-es verziója a következő szimmetrikus titkosítási algoritmusokat támogatja: Blowfish, RC2, Safer-sk64 xtea, Cast-256, RC4, Safer-sk128, DES, RC4-iv, Serpent, Enigma, Rijndael-128, Threeway, Rijndael-192 , TripleDES, LOKI97, Rijndael-256, Twofish, Panama, Saferplus stb. Az egyes algoritmusokról további részletek a Wikipédián találhatók.

Mivel szimmetrikus titkosítást használnak, a kulcsot mindkét félnek ismernie kell, és titokban kell tartania.

Példa egy karakterlánc titkosítására és visszafejtésére

mcrypt_module_open("des", "", "ecb", "")
Ez a funkció megnyitja az algoritmus modult és a használt módot. Ebben a példában a DES algoritmus EKB módban van.

$kulcs = substr($kulcs, 0, mcrypt_enc_get_key_size($td));
A maximális kulcsméretet az mcrypt_enc_get_key_size() függvény meghívásával kell elérni, és minden ennél kisebb érték helyes lesz.

$s = mcrypt_generic($td, $forrás);
Titkosításkor az adatok nulla bájttal vannak feltöltve, így biztosítva, hogy az adatok n* blokkméret hosszúak legyenek. A blokkméret blokkméretét az algoritmus határozza meg (DES esetén a blokkméret 64 bit). Ezért a visszafejtés során a sor végén megjelenhet a „\0”, amelyet a trim() függvény eltávolít.