Php käännettävä avaimen salaus. Salaa ja pura tiedot avaimella PHP:ssä. Salaus- ja todennusavaimet

Oletetaan, että sinun on vaihdettava tietoja kahden palvelimen välillä. Tietojen suojaamiseksi salakuunteluliikenteeltä tiedot salataan. No esimerkiksi toimintojen siirtäminen botnetissä. Tämä ei ole pohjimmiltaan salausta, vaan sitä kutsutaan koodaukseksi, ja sellaisen koodin purkamiseen käytetään tunnettuja toimintoja.

Toisena esimerkkinä pseudosalauksesta annan esimerkin salasanojen "salauksesta" yhden CMS:n tietokannassa - siellä salasanoja ei ole salattu md5()- tai , vaan yksinkertaisesti koodattu base64:n kautta. Nuo. Kun tietokanta vuotaa, hakkerin ei ole vaikeaa purkaa kaikkien salasanojen salaus sisäänrakennetulla PHP-funktiolla base64_decode().

Meidän on lähetettävä tiedot ilman huolta siitä, että joku pystyy sieppaamaan tekstin ja purkaa sen. PHP:llä on suosittu tietojen salauspaketti nimeltä Mcrypt, joka tarjoaa kaksisuuntaisen salauksen (eli varsinaisen tietojen salauksen ja salauksen purkamisen).

Mcrypt-versio 2.4.7 tukee seuraavia symmetrisiä salausalgoritmeja: Blowfish, RC2, Safer-sk64 xtea, Cast-256, RC4, Safer-sk128, DES, RC4-iv, Serpent, Enigma, Rijndael-128, Threeway, Rijndael-19 , TripleDES, LOKI97, Rijndael-256, Twofish, Panama, Saferplus jne. Lisätietoja kustakin algoritmista on kirjoitettu Wikipediaan.

Koska käytetään symmetristä salausta, avain on tunnettava molemmilla osapuolilla ja pidettävä salassa.

Esimerkki merkkijonon salauksesta ja salauksen purkamisesta

mcrypt_module_open("des", "", "ecb", "")
Tämä toiminto avaa algoritmimoduulin ja käytetyn tilan. Tässä esimerkissä DES-algoritmi on ECB-tilassa.

$avain = substr($avain, 0, mcrypt_enc_get_key_size($td));
Suurin avaimen koko on hankittava kutsumalla mcrypt_enc_get_key_size()-funktio, ja mikä tahansa tätä pienempi arvo on oikea.

$s = mcrypt_generic($td, $lähde);
Salauksen aikana tiedot täytetään nolla tavulla varmistaakseen, että tiedot ovat n * lohkon kokoisia. Lohkon koon lohkon koon määrittää algoritmi (DES:lle lohkokoko on 64 bittiä). Siksi salausta purettaessa rivin loppuun saattaa ilmestyä "\0", jonka trim()-funktio poistaa

Kaikki tiedot voidaan sekä salata että purkaa, mukaan lukien PHP:n käyttö. Tällä kielellä on monia tiedon salausominaisuuksia yksinkertaisesta monimutkaiseen.

Katsotaanpa perussalauksen menetelmiä

base64- Voit salata ja purkaa tietoja käyttämällä MIME base64 -algoritmia. Se ei käytä avaimia ja sitä käytetään usein piilottamaan linkkejä PHP:ssä.

Esimerkkejä:
//salaa teksti
$text = "Linkki";
echo base64_encode($teksti); //Tuottaa: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==
//salauksen purku
echo base64_decode("PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==");
?>

Kuten näet, käytimme ensin base64_encode-toimintoa ja saimme salauksen: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==, ja korvasi sen sitten nimellä base64_decode ja sai linkin takaisin.

md5- mahdollistaa tietojen hajauttamisen yksipuolisesti. Toisin kuin base64, et voi enää purkaa niitä takaisin. Usein md5:tä käytetään salasanojen tallentamiseen tietokantaan, mutta viime aikoina salattua md5-yhdistelmää on helppo löytää salauksenpurkutaulukoista, jota monet sivustot ja algoritmit tarjoavat. Siksi md5-salasanojen tallentamiseksi on parempi korvata algoritmit Blowfishilla.

Esimerkki:

//salaa teksti
echo md5("yhdistelmä");
?>

Avaimen salaus

Ja viimeinen esimerkki salauksesta/salauksen purkamisesta, josta halusin puhua, käyttää avainta (salasana). Toisin sanoen annat salaustoiminnolle ainutlaatuisen avaimen ja koodi salataan sen mukana. Salauksen purkaminen edellyttää, että toiminto sisältää salatun koodin ja avaimen, jonka vain sinä tiedät. Esimerkki funktioiden käytöstä koodin alaosassa.

funktio __encode($teksti, $avain) (



$enc_text=base64_encode(mcrypt_generic($td,$iv.$text));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
palauttaa $enc_text; ) )
funktio strToHex($string) (
$hex="";
for ($i=0; $i< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
palauttaa $hex; )
funktio __decode($teksti, $avain) (
$td = mcrypt_module_open("kolminkertaiset", "", "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, $avain, $iv) != -1) (
$decode_text = substr(mdecrypt_generic($td, base64_decode($text)),$iv_size);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $decode_text; ) )
funktio hexToStr($hex) (
$string="";
for ($i=0; $i< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
palauttaa $merkkijono; )

$str = "Sämpylät, jotka on salattava!
Avaimella";
$koodi = strToHex(__encode($str, "Oma#key-do-36-simvolov"));
echo "Salattu koodi: ".$code."
";

$str = __decode(hexToStr($koodi), "Oma#key-do-36-simvolov");
echo "Salauksen purettu koodi: ".$str."
";
?>

Voit salata html-sisältöä. Avaimen pituus saa olla enintään 36 merkkiä.

Tällä menetelmällä voidaan salata jotkin tiedot ja sijoittaa ne txt-tiedostoon tai tietokantaan ja vastaanottaa ne käyttämällä salauksen purkamista avaimella.

Tietenkin minkä tahansa koodin salaus voidaan purkaa/hakkeroida, eikä tämä ole poikkeus, joten käytä vahvoja salausmenetelmiä.

  • Käännös
  • Opetusohjelma

Kääntäjältä: ohjelmoinnin aikana en koskaan unohda, että olen vaarallisen epäpätevä kryptografiassa, ja neuvon kaikkia jatkamaan tästä opinnäytetyöstä (no, ehkä paitsi sinua ja sitä siistiä kaveria siellä). Työn aikana syntyy kuitenkin tavalla tai toisella tietosuojaongelmia, jotka on ratkaistava. Siksi esitän huomionne käännöksen suomalaisen kehittäjän Timo H:n artikkelista, joka oli mielestäni varsin mielenkiintoinen ja hyödyllinen.

Tämä on nopea opas tavallisten sudenkuoppien välttämiseen PHP:n symmetrisellä salauksella.

Otamme huomioon tapauksen, jossa tietoja käsitellään palvelinpuolella (erityisesti salaus tapahtuu palvelimella ja tiedot voidaan vastaanottaa esimerkiksi asiakkaalta selkeänä tekstinä, salasanana jne.), mikä on tyypillinen tapaus PHP - sovelluksille .

Tämän oppaan tietoja ei tule käyttää salattujen verkkoyhteyksien luomiseen, joilla on monimutkaisempia vaatimuksia. Tällaisissa tapauksissa sinun on käytettävä vakoilua tai TLS:ää.

Tietenkin tässä annetut suositukset eivät ole "ainoa mahdollinen tapa" järjestää salaus PHP:ssä. Tämän oppaan tarkoituksena on yrittää jättää vähemmän tilaa virheille ja vaikeille, moniselitteisille päätöksille.

Salaustoiminnot PHP:ssä

Käytä Mcrypt- tai OpenSSL-laajennuksia.

Salausalgoritmi ja sen toimintatapa, kertakoodi (alustusvektori)

Käytä AES-256:ta CTR-tilassa satunnaisen kertakoodin kanssa ( noin käännös: nonce). AES on standardi, joten voit käyttää minkä tahansa laajennuksen toimintoja - Mcrypt tai OpenSSL.

Luo aina uusi kertakoodi. Tässä tapauksessa sinun on käytettävä kryptografisesti turvallista satunnaislukujen lähdettä. Lue alta hieman lisää satunnaislukujen luomisesta. Kertakäyttöinen koodi ei ole salainen, ja se voidaan ketjuttaa salatekstiin lähetystä ja myöhempää salauksen purkamista varten.

Kertakoodin on oltava 128 bittiä (16 tavua) pitkä, vain tavujen merkkijono ilman koodausta.

Mcrypt-laajennuksessa AES tunnetaan nimellä Rijndael-128 ( noin käännös: huolimatta siitä, että puhumme AES-256:sta, tämä ei ole virhe. AES-256 != Rijndael-256). OpenSSL:ssä vastaavasti AES-256-CTR.

Esimerkki Mcryptin käytöstä:
Esimerkki OpenSSL:n käytöstä:
Varmista, että salaus toimii oikein käyttämällä testivektoreita ( noin käännös: AES-256-CTR, katso kohta F.5.5 sivulla 57).

CTR-tilassa on joitain rajoituksia salatun tiedon kokonaismäärälle. Käytännössä tätä ei välttämättä tapahdu, mutta muista, että yhdellä avaimella ei saa salata enempää kuin 2^64 tavua, riippumatta siitä onko kyseessä yksi pitkä viesti vai monta lyhyttä viestiä.

CTR-tila pysyy vakaana vain, jos et käytä samaa kertakoodia samalla avaimella. Tästä syystä on tärkeää luoda kertaluonteisia koodeja käyttämällä kryptografisesti vahvaa satunnaisuuden lähdettä. Lisäksi tämä tarkoittaa, että sinun ei pitäisi salata enempää kuin 2^64 viestiä yhdellä avaimella. Koska kertakoodin pituus on 128 bittiä, viestien (ja niitä vastaavien kertaluontoisten koodien) rajoitus 2^128/2 on tärkeä syntymäpäiväparadoksin ( noin käännös:).

Ja muista, että salaus ei peitä sitä tosiasiaa, kuinka paljon dataa lähetät. Esimerkkinä ääritapauksesta, jos salaat viestit, jotka sisältävät vain "kyllä" tai "ei", salaus ei tietenkään piilota näitä tietoja.

Tietojen todennus

Tarkista aina tietojen aitous ja eheys.
Käytä tätä varten MAC:ia salauksen jälkeen. Nuo. Ensin tiedot salataan, ja sitten HMAC-SHA-256 otetaan tuloksena olevasta salatekstistä, mukaan lukien itse salateksti ja kertakoodi.

Kun purat salausta, tarkista ensin HMAC käyttämällä vertailualgoritmia, joka kestää ajoitushyökkäyksiä. Älä vertaa suoraan $user_submitted_mac ja $calculated_mac käyttämällä == tai === vertailuoperaattoreita. On vielä parempi käyttää "kaksinkertaista HMAC-tarkistusta".

Jos HMAC-tarkistus onnistuu, salauksen purku voidaan suorittaa turvallisesti. Jos HMAC ei sovellu, sammuta se välittömästi.

Salaus- ja todennusavaimet

Ihannetapauksessa käytä avaimia, jotka on johdettu kryptografisesti vahvasta satunnaisuuden lähteestä. AES-256 vaatii 32 tavua satunnaista dataa ("raaka" merkkijono - bittisarja ilman koodausta).

Jos sovellus on käynnissä PHP-versiossa alle 5.5, jossa ei ole sisäänrakennettua PBKDF2-toteutusta, sinun on käytettävä omaa toteutustasi PHP:ssä, josta löytyy esimerkki täältä: https://defuse. ca/php-pbkdf2.htm. Huomaa, että omaan toteutukseen luottaminen ei välttämättä ratkaise avainta oikein, kuten sisäänrakennettu hash_pbkdf2()-funktio tekee.

Älä käytä samaa avainta salaukseen ja todentamiseen. Kuten edellä mainittiin, salausavaimeen tarvitaan 32 tavua ja todennusavaimeen (HMAC) 32 tavua. PBKDF2:lla voit ottaa 64 tavua salasanasta ja käyttää esim. 32 tavua salausavaimena ja loput 32 tavua todennusavaimena.

Jos salasanasi on tallennettu tiedostoon, esimerkiksi HEX-merkkijonona, älä koodaa niitä uudelleen ennen kuin syötät ne salaustoimintoihin. Käytä sen sijaan PBKDF2:ta muuntaaksesi HEX-koodatut avaimet suoraan korkealaatuiseksi salaus- tai todennusavaimeksi. Tai käytä SHA-256:ta ilman ylimääräistä koodaustulostusta (vain 32-tavuinen merkkijono) salasanojen hajauttamiseen. Tavallinen salasanan hajautus tarjoaa tarpeeksi entropiaa. Lisätietoja on seuraavissa kappaleissa.

Avaimen jousto

Ensinnäkin sinun tulee välttää matalan entropian avaimia. Mutta silti, jos sinun on käytettävä esimerkiksi käyttäjien salasanoja, sinun on ehdottomasti käytettävä PBKDF2:ta suurella iteraatiomäärällä avainten suojauksen maksimoimiseksi.

Yksi PBKDF2:n parametreista on hajautusiteraatioiden määrä. Ja mitä korkeampi se on, sitä parempaan avaimen turvallisuuteen voit luottaa. Jos koodisi on käynnissä 64-bittisellä alustalla, käytä SHA-512:ta hajautusalgoritmina PBKDF2:lle. Käytä 32-bittiselle alustalle SHA-256:ta.

Verkkosovelluksissa ei kuitenkaan ole mahdollista käyttää suhteellisen suurta määrää iteraatioita DoS-hyökkäyksen riskin vuoksi. Siksi avainlaatu ei ole yhtä korkea kuin offline-sovelluksissa, joilla on varaa suureen määrään iteraatioita ilman tällaista riskiä. Pääsääntöisesti online-sovelluksissa valitaan sellainen määrä hajautusiteraatioita, että PBKDF2 kestää enintään 100 ms.

Jos voit käyttää korkean entropian salasanoja, sitä ei tarvitse venyttää samalla tavalla kuin alhaisen entropian salasanoja. Jos esimerkiksi luot "encryption_master_key" ja "auth_master_key" käyttämällä /dev/urandom, PBKDF2:ta ei tarvita ollenkaan. Muista vain käyttää avaimia bittisarjoina ilman koodausta.

Lisäksi PBKDF2:lla ei ole vaikeaa saada sekä salaus- että todennusavaimia yhdestä pääsalasanasta (käytä vain muutama iteraatio tai jopa yksi). Tämä on hyödyllistä, jos käytät vain yhtä "pääsalasanaa" sekä salaukseen että todentamiseen.

Avainten säilytys ja hallinta

Parasta on käyttää erillistä avainten tallennuslaitetta (HSM).

Jos tämä ei ole mahdollista, hyökkäyksen monimutkaistamiseksi voidaan käyttää avaintiedoston tai asetustiedoston (joka tallentaa todelliset salaus-/todennusavaimet) salausta käyttämällä erilliseen sijaintiin (kotihakemiston tai sivuston juuren ulkopuolelle) tallennettua avainta. . Voit esimerkiksi käyttää Apache-ympäristömuuttujaa httpd.conf-tiedostossa tallentaaksesi avaimen, jota tarvitaan todellisen avaintiedoston salauksen purkamiseen:
SetEnv-avaintiedosto
Nyt, jos sivuston juuressa ja sen alla olevat tiedostot, mukaan lukien tiedostot avaimilla, vaarantuvat (esimerkiksi jos varmuuskopio vuotaa), salatut tiedot pysyvät turvassa, koska ympäristömuuttujaan tallennettu avain ei ole vaarantunut. On tärkeää muistaa, että httpd.conf-tiedostot tulee varmuuskopioida erikseen, eikä keyfile_key-muuttujaa saa vaarantaa esimerkiksi phpinfo(:n) lähdön kautta.

Jos käytät tiedostoa konfigurointiparametrin sijaan, on mahdollista järjestää avainten kierto. Pahimmassa tapauksessa, jos vastustaja on saanut salaus- ja todennusavaimesi huomaamatta, avainten kiertäminen tietyin väliajoin voi rajoittaa heidän pääsyään (olettaen, että hän ei voi saada uusia avaimia). Tämä tekniikka auttaa vähentämään vahinkoa, koska vihollinen ei voi käyttää vaarantuneita avaimia loputtomiin.

Tietojen pakkaus

Yleensä lähdetekstiä ei pidä pakata ennen sen salaamista. Tämä voi antaa viholliselle lisätyökalun analysointia varten.

Jos esimerkiksi tallennat istuntotietoja salattuihin evästeisiin, joista osa on käyttäjän toimittamia ja joista osa edustaa salaisia ​​tietoja, vastustaja voi saada lisätietoja salaisuudesta lähettämällä tavallisena käyttäjänä joitain erityisesti muotoiltuja tietoja ja mittaamalla, kuinka tuloksena olevien salatekstien pituus muuttuu.

Tekstiä pakataan tehokkaammin, jos siinä on toistuvia alueita. Käsittelemällä käyttäjätietoja voit valita ne siten, että se osuu osittain salaisten tietojen kanssa. Mitä suurempi vastaavuus, sitä pienempi tulosteen salateksti. Tämän tyyppistä hyökkäystä kutsutaan rikolliseksi.

Jos sinulla ei ole kovaa tarvetta pakata tietoja, älä pakkaa niitä.

Palvelinympäristö

Yleissääntönä on, että sinun ei pitäisi isännöidä tietoturvaan liittyviä sovelluksia jaetulla palvelimella. Esimerkiksi jaetussa isännöinnissä, jossa vastustaja voi käyttää virtuaalikonetta samalla fyysisellä palvelimella kuin sinä.

On monia syitä, jotka tekevät jaetuista palvelimista epäilyttävän paikan turvallisuuden kannalta kriittisten sovellusten isännöinnille. Esimerkiksi virtuaalisten palvelimien välisiä hyökkäyksiä on äskettäin osoitettu: eprint.iacr.org/2014/248.pdf. Tämä on hyvä muistutus siitä, että hyökkäävät tekniikat eivät heikkene, vaan niitä hiotaan ja parannetaan ajan myötä. Tällaiset sudenkuopat on aina otettava huomioon.

Asiantuntijakonsultaatio

Viimeisenä mutta ei vähäisimpänä, kysy asiantuntijalta turvakoodisi tarkistamista.

(PHP 4, PHP 5, PHP 7)

krypta — yksisuuntainen merkkijonojen hajautus

Varoitus

Tämä toiminto ei ole (vielä) binaarisesti turvallinen!

Kuvaus

krypta (merkkijono $str [, merkkijono $suolaa]): merkkijono

krypta() palauttaa tiivistetyn merkkijonon käyttämällä standardia Unix DES -pohjaista algoritmia tai vaihtoehtoisia algoritmeja, jotka saattavat olla saatavilla järjestelmässä.

Suolaparametri on valinnainen. Kuitenkin, krypta() luo heikon tiivisteen ilman suolaa. PHP 5.6 tai uudempi aiheuttaa E_NOTICE-virheen ilman sitä. Varmista, että määrität riittävän vahvan suolan turvallisuuden parantamiseksi.

password_hash() käyttää vahvaa tiivistettä, tuottaa vahvan suolan ja käyttää oikeat kierrokset automaattisesti. password_hash() on yksinkertainen krypta() kääre ja yhteensopiva olemassa olevien salasanatiivisteiden kanssa. Käyttö password_hash() kannustetaan.

Jotkut käyttöjärjestelmät tukevat useampaa kuin yhtä tiivistetyyppiä. Itse asiassa joskus tavallinen DES-pohjainen algoritmi korvataan MD5-pohjaisella algoritmilla. Hajautustyypin laukaisee suola-argumentti. Ennen versiota 5.3 PHP määritti käytettävissä olevat algoritmit asennuksen yhteydessä järjestelmän crypt() perusteella. Jos suolaa ei ole annettu, PHP luo automaattisesti joko tavallisen kahden merkin (DES) suolan tai kahdentoista merkin ( MD5), riippuen MD5:n crypt() saatavuudesta, PHP asettaa vakion nimeltä CRYPT_SALT_LENGTH joka osoittaa pisimmän voimassa olevan suolan, jonka käytettävissä olevat tiivisteet sallivat.

Vakio DES-pohjainen krypta() palauttaa suolan tulosteen kahtena ensimmäisenä merkkinä. Se käyttää myös vain str:n kahdeksaa ensimmäistä merkkiä, joten pidemmät merkkijonot, jotka alkavat samoilla kahdeksalla merkillä, tuottavat saman tuloksen (kun käytetään samaa suolaa).

Järjestelmissä, joissa crypt()-funktio tukee useita hajautustyyppejä, seuraavat vakiot asetetaan arvoon 0 tai 1 riippuen siitä, onko tietty tyyppi saatavilla:

  • CRYPT_STD_DES- Tavallinen DES-pohjainen hash, jossa on kaksimerkkinen suola aakkosesta "./0-9A-Za-z". Virheellisten merkkien käyttö suolassa aiheuttaa crypt():n epäonnistumisen.
  • CRYPT_EXT_DES- Laajennettu DES-pohjainen hash. "suola" on 9-merkkinen merkkijono, joka koostuu alaviivasta, jota seuraa 4 tavua iteraatiomäärää ja 4 tavua suolaa. Nämä on koodattu tulostettaviksi merkeiksi, 6 bittiä per merkki, vähiten merkitsevä merkki ensin. Arvot 0-63 on koodattu muodossa "./0-9A-Za-z". Virheellisten merkkien käyttö suolassa aiheuttaa crypt():n epäonnistumisen.
  • CRYPT_MD5- MD5-hajautus kahdentoista merkin suolalla alkaen $1
  • CRYPT_BLOWFISH- Blowfish-hajautus suolalla seuraavasti: "$2a$", "$2x$" tai "$2y$", kaksinumeroinen hintaparametri, "$" ja 22 merkkiä aakkosesta "./0-9A- Za-z". Tämän alueen ulkopuolella olevien merkkien käyttäminen suolassa saa crypt() palauttamaan nollapituisen merkkijonon. Kaksinumeroinen kustannusparametri on taustalla olevan Blowfish-pohjaisen hajautusalgoritmetrin iteraatiomäärän 2 peruslogaritmi, ja sen on oltava välillä 04-31, tämän alueen ulkopuolella olevat arvot aiheuttavat crypt()-toiminnon epäonnistumisen. PHP:n versiot ennen 5.3.7:a tukevat vain "$2a$" suolaetuliiteenä: PHP 5.3.7 esitteli uudet etuliitteet korjatakseen Blowfishin toteutuksen tietoturvaheikkouden. Katso täydelliset tiedot tietoturvakorjauksesta, mutta yhteenvetona vain PHP 5.3.7:ään ja uudempaan kohdistavien kehittäjien tulee käyttää arvoa "$2y$" "$2a$" sijaan.
  • CRYPT_SHA256- SHA-256 hash kuudentoista merkin suolalla, jonka etuliite on $5 $. Jos suolamerkkijono alkaa sanalla "rounds=
  • CRYPT_SHA512- SHA-512 hash, jossa on kuusitoista merkkiä suola, jonka etuliite on 6 dollaria. Jos suolamerkkijono alkaa sanalla "rounds= $", N:n numeerista arvoa käytetään osoittamaan, kuinka monta kertaa hajautussilmukka tulee suorittaa, aivan kuten Blowfishin kustannusparametri. Kierrosten oletusmäärä on 5000, kierrosten vähimmäismäärä on 1000 ja enimmäismäärä 999 999 999. Tämän alueen ulkopuolella oleva N:n valinta katkaistaan ​​lähimpään rajaan.

PHP 5.3.0:sta lähtien PHP sisältää oman toteutuksensa ja käyttää sitä, jos järjestelmästä puuttuu tuki yhdelle tai useammalle algoritmille.

Parametrit

Hajautettava merkkijono.

Varoitus

Käyttämällä CRYPT_BLOWFISH algoritmi, johtaa str-parametrin lyhentämiseen enintään 72 merkin pituiseksi.

Valinnainen suolanauha tiivistyksen perustana. Jos sitä ei ole annettu, käyttäytyminen on algoritmin toteutuksen määrittelemä ja se voi johtaa odottamattomiin tuloksiin.

Palautusarvot

Palauttaa tiivistetyn merkkijonon tai merkkijonon, joka on lyhyempi kuin 13 merkkiä ja joka taatusti eroaa virheestä.

Varoitus

Salasanoja vahvistettaessa tulee käyttää merkkijonojen vertailutoimintoa, joka ei ole alttiina ajoitushyökkäyksille. krypta() aiemmin tunnettuun hashiin. PHP 5.6 alkaen tarjoaa hash_equals() tähän tarkoitukseen.

Muutosloki

Versio Kuvaus
5.6.5 Kun vikamerkkijono "*0" annetaan suolana, "*1" palautetaan nyt johdonmukaisuuden vuoksi muiden salaustoteutusten kanssa. Ennen tätä versiota PHP 5.6 palautti virheellisesti DES-hajautusarvon.
5.6.0 Nosta E_NOTICE-turvavaroitusta, jos suola jätetään pois.
5.5.21 Kun vikamerkkijono "*0" annetaan suolana, "*1" palautetaan nyt johdonmukaisuuden vuoksi muiden kryptaustoteutusten kanssa. Ennen tätä versiota PHP 5.5 (ja aiemmat haarat) palautti virheellisesti DES-hajautusarvon.
5.3.7 Lisätty $2 x $ ja $2y$ Blowfish-tilat mahdollisten korkean bittien hyökkäysten käsittelemiseksi.
5.3.2 Lisätty SHA-256 ja SHA-512 krypta Ulrich Drepperin » toteutuksen perusteella.
5.3.2 Korjattu Blowfish-käyttäytyminen virheellisillä kierroksilla palauttamaan "epäonnistunut" merkkijono ("*0" tai "*1") sen sijaan, että palaisi DES:ään.
5.3.0 PHP sisältää nyt oman toteutuksensa MD5-skriptille, Standard DES:lle, Extended DES:lle ja Blowfish-algoritmeille ja käyttää sitä, jos järjestelmästä puuttuu tuki yhdelle tai useammalle algoritmille.

Esimerkkejä

Esimerkki #1 krypta() esimerkkejä

$hashed_password = crypt("omasalasana"); // anna suolan muodostua automaattisesti

/* Sinun tulee välittää kaikki crypt():n tulokset suolana a-vertailussa
salasana, jotta vältetään ongelmat käytettäessä erilaisia ​​hajautusalgoritmeja. (Kuten
yllä sanotaan, että tavallinen DES-pohjainen salasanan hajautus käyttää 2-merkkistä suolaa,
mutta MD5-pohjainen hajautus käyttää 12:ta.) */
if (hash_equals ($hashed_password , crypt ($user_input , $hashed_password )))) (
echo "Salasana vahvistettu!" ;
}
?>

Esimerkki #2 Käyttäminen krypta() htpasswd:n kanssa

//Aseta salasana
$salasana = "oma salasana" ;

// Hanki hash, jolloin suola muodostuu automaattisesti
$hash = krypta($salasana);
?>

Esimerkki #3 Käyttäminen krypta() eri hash-tyypeillä

/* Nämä suolat ovat vain esimerkkejä, eikä niitä tule käyttää sanatarkasti koodissasi.
Sinun tulee luoda erillinen, oikein muotoiltu suola jokaiselle salasanalle.
*/
jos (CRYPT_STD_DES == 1 ) (
echo "Standard DES: " . krypta ("rasmuslerdorf" , "rl") . "\n" ;
}

if (CRYPT_EXT_DES == 1 ) (
echo "Laajennettu DES:". krypta ("rasmuslerdorf" , "_J9..rasm" ) . "\n" ;
}

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

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

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

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

Yksi kryptografian perustotuuksista on, että sinun ei pitäisi keksiä mitään tällä alalla, ellet ole ammattilainen. Tämä on osittain totta, sillä kaikkea parasta on jo pitkään keksitty, kärsitty ja käytetty vuosikymmeniä tietotekniikan alalla. Totuuden toinen puoli on, että tietyn tietokentän kehittyminen tapahtuu vain, kun siinä on jatkuvasti uusia ideoita ja alkuperäisiä ratkaisuja.

Ilmeisistä syistä emme tähtää teollisen salauksen jättiläisiin, kuten AES:iin, vaan uppoudumme niin sanotusti omaan kryptografiseen tutkimukseemme blackjackin ja ilon kera.

Osittain siksi, että se on mielenkiintoista, osittain siksi, että mallintamalla jotain omaa ja vertaamalla sitä tunnettuihin standardeihin näet selvästi kontrastin, tehokkaat ratkaisut ja suorat laiminlyönnit ja ymmärrät, mihin voit pyrkiä tehokkuuden parantamiseksi.

Mutta vettä riittää jo.

Oletetaan, että verkkosovelluksemme on kirjoitettu PHP:llä, tarvitsee palautuvan salauksen ja uskomme, että voimme kirjoittaa oman salausjärjestelmän.

Joten kirjoitetaan oma käännettävä salausjärjestelmämme yksityisillä ja julkisilla avaimilla, jolla on seuraavat enemmän tai vähemmän turvallisen salausalgoritmin ominaisuudet:

  1. Kohinasymbolien läsnäolo lopullisessa salauksessa.
  2. Jokaisen lähettäjä-kohdekanavan tiedot salataan yksityisellä avaimella, ja täsmäytystoiminto on yksilöllinen jokaiselle avaimelle.
  3. Jokainen viesti saa tiivistelmäkoodin - yksilöllisen koodin, joka on yksityisen avaimen ja alkuperäisen viestin funktio. Tämä on tarpeen "lähdemerkin" täsmäystoiminnon ainutlaatuisuuden saavuttamiseksi<=>koodattu symboli" ei vain "Lähettäjä-vastaanotin" -kanavalle, vaan myös jokaiselle yksittäiselle viestille.

    Näin ollen vaikka kuvittelemmekin, että tietyn viestin koodattujen ja alkuperäisten symbolien vastaavuus on tullut tunnetuksi kryptografisen analyysin, esimerkiksi taajuusanalyysin, avulla, tämä ei anna mitään preferenssejä toista viestiä tutkittaessa.

  4. Taajuusanalyysin vaikeuttamiseksi koodaamme jokaisen alkuperäisen viestin symbolin kahdella salaussymbolilla.
Mitä tapahtui.

Itse asiassa voit nähdä lopputuloksen

SymCoder-luokka sisältää salaus- ja salauksenpurkumenetelmiä.

Salaus suoritetaan code()-menetelmällä, joka syöttää alkuperäisen viestin.

Tässä luodun vastaavuustaulukon viesti tab_codedissa luo salatun viestin, joka on laimennettu reunoilta ja sisältä kohinasymboleilla.

Muuten, kohinasymbolit ovat yksilöllisiä kullekin lähettäjä-kohdekanavalle, koska ne luodaan kanavaavaimen avulla, mutta ne eivät ole ainutlaatuisia viesteille. Code_symbolsissa salaukseen käytetyt symbolit ovat joitain välimerkkejä ja symboleja, kuten %, @ jne.

Jokaista koodattua symbolia kohden on kaksi koodia koodisymboleista, johtuen ilmeisistä syistä, koska niitä on useita kertoja vähemmän kuin koodattuja symboleja.

Create_tab_coded vastaavuustaulukko rakennetaan käyttämällä sanomaavaimen tiivisteen käännöstä taulukoksi, jonka elementtien määrä on yhtä suuri kuin koodisymbolitaulukon elementtien lukumäärä. Myös kaksimerkkisten koodien läpikäynnin aloituspaikka on aina erilainen ja liittyy kanavaavaimeen. Tämä mahdollistaa sen, että algoritmi koodattujen merkkien läpikulkuun ja koodimerkkien yhteensovitukseen on aina (tai taatusti usein) erilainen.

Esimerkiksi "hello world" -viesti näyttää koodattuna tältä:

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

Ja tässä on sama viesti koodattuna uudelleen:

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

Voidaan nähdä, että saman viestin tiivistelmä on sama, mutta salauksesta tulee erilainen - kohinasymbolit lisätään mielivaltaisessa vastaavuudessa ja mielivaltaisessa järjestyksessä jokaiselle uudelle salaukselle.

Viesteissä on redundanssia, joka pienenee viestin äänenvoimakkuuden kasvaessa, jopa 10 % kohinaa (lyhyimmissä viesteissä kohina on 90 % tai enemmän), salatun viestin vähimmäispituus on 116 merkkiä. Yksi tämän salausmenetelmän haitoista on se, että koodatut viestit ovat vähintään kaksinkertaisia.

Dekoodaus koostuu käänteiskäännöksestä muodossa "koodisymboli" - alkuperäinen symboli, jonka kohina on leikattu pois viestistä. Mikä voisi olla avain? Periaatteessa mikä tahansa merkkijono, joka on yksilöllinen jokaiselle kohde-vastaanotin-parille.

Jos esimerkiksi luot viestin salausviestin, yksityisen avaimen yksinkertaisin versio voisi olla md5($user_id_1. $salt. $user_id_2), jolloin avain on yksilöllinen jokaiselle viestikanavalle.