Kirjoittaja: tsuriga (2004).
⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠
PHP:ssä on valmiina md5
, sha1
ja crc32
-funktiot, mutta jos haluat tietää lisää PHP:n tarjoamista salausmenetelmistä niin lukaisepa tämä opas. Mhashilla voidaan luoda tarkastussummia, tiivisteitä, viestikoosteita ja autentikointitunnisteita. Mcryptillä taasen voidaan salata dataa kryptaamalla se mcrypt-kirjaston tukemalla menetelmällä. Nämä salaukset voidaan myös purkaa käyttämällä tiettyä avainta. Crackilla voit testata salasanojesi kestävyyttä. Se käyttää Cracklib -sanastoa testaukseen ja palauttaa selkokielisen kommentin salasanan kestävyydestä (käyttökelpoisuudesta). Huomioitavaa on, että Crack
on suunnattu Unix-käyttöympäristöille, kun taas mhash
ja mcrypt
on käsitelty tässä asennuksen kannalta toistaiseksi vain Windowsin osalta. Lisäksi opas on kirjoitettu PHP:n versio 4:n aikaan, ja kirjastot uudistuivat versio 5:n tulon myötä. Alla lyhyesti muutoksista.
PHP5
Mhash on korvattu Hash-funktioilla versiosta 5.1.2 eteenpäin, eikä se vaadi enää erillistä asennusta. Versiosta 5.3 eteenpäin Mhash-kirjasto ei enää tule PHP:n mukana, vaan se on siirretty yhdessä Crack-kirjaston kanssa PECL-paketin alaisuuteen. Mcrypt vaatii PHP:n versiosta 5 eteenpäin libmcryptin version 2.5.6 tai uudemman. Oppaan lopusta löytyy lisää linkkejä.
Salaustermejä suomi-englanti
autentikointitunniste | authentication code |
tiiviste | hash value |
tarkastussumma | checksum |
viestikooste | message digest |
Näistä kaikista opas käyttää joko suomenkielistä nimitystä summa, tai englanninkielistä yhteisnimitystä hash.
Asennus
Windows
Avaa php.ini, etsi sieltä kohta ;extension=php_mhash.dll ja ota ; -merkki pois sen edestä. Mikäli PHP:n hakemistosta ei löydy libmhash.dll:ää, saat sen täältä.
Käyttö
Funktio mhash(int hash, string data [,string avain])
hash | jokin tuetuista hash-menetelmistä (kts. manuaali) |
data | salattava data |
avain | valinnainen avain summaviestin autentikointikoodin tuottamiseksi. Avainta ei voi käyttää Gost-, CRC32- eikä CRC32B -algoritmeilla |
Mahdollisia käyttötapoja
<?php // Esimerkkejä mhashin käytöstä $data = "salateksti"; // data, josta summa lasketaan $avain = "avain"; // avain hash-summien laskemiseen echo $data . " =\n"; // lasketaan summat datasta eri hash-menetelmillä // mhash palauttaa hashin binäärimuodossa, josta // sen voi halutessaan muuttaa heksamuotoon, jonka // esim. selain osaa sitten tulostaa oikein // md5-algoritmilla datasta muodostettu summa // php:ssä on myös funktio md5(string), joka tekee saman kuin tämä $md5hash = bin2hex(mhash(MHASH_MD5, $data)); // md5-hash avaimella $md5k = bin2hex(mhash(MHASH_MD5, $data, $avain)); // Gost-algoritmin summa $gost = bin2hex(mhash(MHASH_GOST, $data)); // Tiger-algoritmin summa $tiger = bin2hex(mhash(MHASH_TIGER, $data)); /* Tulostetaan tulokset */ echo "md5 mhashilla: " . $md5hash . "\n"; echo "md5 md5-funktiolla: " . md5($data) . "\n"; echo "md5 avaimella: " . $md5k . "\n"; echo "Gost: " . $gost . "\n"; echo "Tiger: " . $tiger . "\n"; ?>
Koska kyse on usein salaisesta informaatiosta, ei summia yleensäkään muodosteta sivulle tulostusta varten, vaan niitä käytetään parantamaan tietoturvaa tai helpottamaan tiedostojen oikeellisuuden tarkistamista. Kun datalle on laskettu koostesumma sopivan pitkällä avaimella, ei ilkeämieliselle hyökkääjälle ole enää juurikaan iloa tuon summan näkemisestä. Näin tuo ilkimys ei siis pääse käsiksi selkokielisiin arvotietoihin. Tiedostoja levitettäessä on hyvä tarjota tiedoston yhteydessä autentikointitunnistetta - näin käyttäjä voi tarkistaa tiedoston aitouden ja eheyden. Jos data halutaan saada vielä takaisin alkuperäiseen muotoon, täytyy turvautua kirjastoon, jota tutkimme seuraavaksi.
Asennus
Windows
Tarvittavan dll-tiedoston saat täältä. Tallenna se PHP:n lisäosahakemistoosi. Avaa php.ini ja ota ; -merkki pois ;extension=php_mcrypt.dll -kohdan edestä.
Käyttö
Funktio string mcrypt_encrypt(string salausmenetelmä,string avain,string data,string tila[, string iv])
salausmenetelmä | jokin valmiista salakirjoitusmenetelmävakioista (kts. manuaali) |
avain | avain, jolla data kryptataan |
data | kryptattava data |
tila | jokin valmiista kryptaustilavakioista (kts. manuaali) |
iv | Valinnainen alustusvektori (initialization vector ), jota käytetään kryptaustilojen alustamisessa. (kts. manuaali) |
ECB-tilassa kryptauksesta voi paljastua kaava, kun jokainen lohko puretaan täysin identtisesti. Tämä altistaa kryptauksen toistohyökkäyksille. Turvallisempaa on kryptata joko CBC-, CFB- tai NOFB-tilassa. Lisää aiheesta Wikipedian kryptaustila-sivulla. Lisäksi PHP.netin manuaalin käyttäjäkommenttien mukaan kannattaa sarakkeen tyypiksi asettaa BLOB, mikäli kryptauksia (MySQL-) kantaan tallentelee.
Funktio mcrypt_decrypt
käyttää samoja parametreja.
Yksinkertainen kryptaus ja sen purku
<?php // Kryptausta salaisilla avaimilla $avain = "salainen avain"; // avain, jota käytetään kryptaukseen $saladata = "salaista tietoa"; // salattava data $ivk = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC); // haetaan IV:n koko $iv = mcrypt_create_iv($ivk, MCRYPT_RAND); // luodaan uusi IV // kryptataan salainen data Blowfish-salakirjoitusmenetelmällä salaisen avaimen kanssa // kryptaustilavakiot ovat merkkijonoja lyhenteistään, joten parametriksi voi antaa vakion sijaan tilan lyhenteen // MCRYPT_MODE_CBC -> "cbc" $kryptattu = mcrypt_encrypt(MCRYPT_BLOWFISH, $avain, $saladata, "cbc", $iv); // puretaan salaus oikealla avaimella $purettu = mcrypt_decrypt(MCRYPT_BLOWFISH, $avain, $kryptattu, "cbc", $iv); // yritetään purkaa salausta väärällä avaimella $purkamaton = mcrypt_decrypt(MCRYPT_BLOWFISH, "kodin avain", $kryptattu, "cbc", $iv); // tulostetaan kryptattu saladata echo bin2hex($kryptattu) . "\n"; // tulostetaan purettu salaus, ilman trimmiä tämä tulostaisi muutaman turhan merkin mukaan echo trim($purettu) . "\n"; // tulostetaan väärällä avaimella purettu salaus echo trim($purkamaton); ?>
Asennus
Unix
Crackia varten tarvittavan kirjaston saat täältä. Asenna se haluamaasi hakemistoon. Avaa php.ini ja ota ; -merkki pois kohdan extension=php_crack.dll edestä. Etsi kohta [Crack], tee sen alla olevalle kohdalle samoin ja määritä siihen sanakirjasi polku. Jätä kuitenkin tiedostopääte pois polusta. Esimerkiksi näin: crack.default_dictionary = "/usr/local/lib/pw_dict". Asennus vaatii vielä php:n kääntämisen asetuksella --with-crack[=DIR].
Käyttö
<?php // Cracktest.php - Tämä on lähes suoraan php:n manuaalista käännetty // Tässä oletetaan ettet ole asettanut php.iniin crack-sanakirjan polkua // "sanakirja" -sanan paikalla voisi ehkä käyttää "kirjastoa", samapa tuo // salasana, jonka vahvuutta testataan $salainensana = "s4l4s4n4"; // HUOM: crack_opendictin ja crack_closedictin kutsuminen ei ole välttämätöntä // mikäli olet määrittänyt CrackLibin asennuspolun php.iniin kuten ohjeissa // on neuvottukin. // avataan CrackLib sanakirja $sanakirja = crack_opendict("/usr/local/lib/pw_dict") or die("Sanakirjan avaus epäonnistui"); // tarkastetaan salasanan vahvuus crack_check($salainensana); // tulostetaan viimeisin viesti echo crack_getlastmessage(); // suljetaan sanakirja (kts. ylempää huomio) crack_closedict($sanakirja); ?>
Loppusanat
Internetistä löytyy valtavasti lisää tietoa kryptauksesta ja turvatoimista webissä yleisellä tasolla. Korjaus- ja parannusehdotuksia sekä asennusohjeita muille käyttöjärjestelmille voi kirjoittaa kommentteihin tai minun / ylläpidon sähköpostiin, ongelmista voi keskustella mieluiten keskustelualueella. Lyhyet vinkit voi laittaa kommentteihin. Jos et saa näillä ohjeilla jotakin lisäosista toimimaan, niin pistäpä hieman tietoja lisäosasta, käyttöjärjestelmästäsi ja PHP-versiostasi kommentteihin / sähköpostiini ja kerro ongelman nimi. Linkit funktioiden manuaaleihin ja kotisivuihin ovat:
Kiva tietää muistakin ku md5:stä, mutta on sekin varmaan aika turvallinen... :)
It-viikko: Suositut kryptausmenetelmät haavoittuvia
Kyllä sillä md5:llaki silti pärjää, kunhan muistaa käyttäjähkohtaiset suolat.
// Tässä yksi esimerkki miten voi käyttää TripleDES salausta MD5:sen tilalla. // Voit myös käyttää: // DES, TripleDES, Blowfish, 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, // RC2 ja GOST CBC:ssä, OFB, CFB ja ECB salaus moodit. Tukee myös RC6 ja IDEA:ta. // Tarvitset kuitenkin Mcrypt paketin. // Lisätietoja: // https://www.php.net/manual/en/ref.mcrypt.php // http://mcrypt.sourceforge.net/ // ensin määrittele avain, mitä pitempi niin sen kivempi $CryptKey = "D!v2PvID~c9H0NIEkAIv%u8Da"; // lause joka salataan $Tieto = "Hello World!"; // avaa moduuli oikeilla arvoilla $td = mcrypt_module_open('tripledes', '', 'ecb', ''); $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); mcrypt_generic_init($td, $CryptKey, $iv); // Salaus... $SalattuTieto = mcrypt_generic($td, $Tieto); // Purkaminen... $PurettuTieto = mdecrypt_generic($td, $SalattuTieto); // moduulin sulkeminen mcrypt_generic_deinit($td); mcrypt_module_close($td); // ------------ EOF ------------ // Usein veppi tilanteissa käsittellään monimutkaista tietoa joka sisältää // merkkejä jotka voivat mennä sekaisin. Silloin voi käyttää lisäksi // base64 pakkausta jolloin tiedon voi lähettää vaikka POST:illa. // Salaus tällöin... $SalattuTieto = base64_encode(mcrypt_generic($td, $Tieto)); // Purkaminen sitten... $PurettuTieto = mdecrypt_generic($td, base64_decode($SalattuTieto)); // Lisäksi joskus halutaan pitää eri arvot erossa toisistaan // käyttäen esimerkiksi ; merkkiä. Silloin: $SalattuTieto = base64_encode(mcrypt_generic($td, implode(";", $Tieto))); $PurettuTieto = explode(";", mdecrypt_generic($td, base64_decode($Salattutieto))); // Korjatkaa, jos löytyy virheitä.
Oikein mielenkiintoinen opas. Mielestäni on liian vähän materiaalia tarjolla erilaisista salausmenetelmistä, ja liikaa painoa MD5:ssä. En millään tavalla vähättele MD5:tä mutta PHP:ssä on niin laajatuki erilaisille kryptauksille että on melkein sääli ettei niitä käytetä tai niille anneta sitä arvoa joka niille kuuluu.
Tuossa mainitaan että, "mhash ja mcrypt on käsitelty tässä toistaiseksi vain Windowsin osalta". Eli jotta ei tule sekaannusta, niin molemmat ovat avoinna myös unix alustoilla, ja mikäli et itse pyöritä palvelinta niin silloin käyttämisessä ei pitäisi olla suuria eroja.
Eri algoritmeistä olisi ehkä kannattanut puhua hiukan lisää, koska itse tapa jolla niitä hyödynnetään on paljon helpompi ymmärtää, kuin itse algoritmit, joita on suhteellisen muutama. On yhtä hyödyllistä ja tärkeää tietää mitä algoritmia käyttää ja miksi.
Otin md5:en esille mhashissa vain kertoakseni, että sen voi tehdä myös sillä. Eihän siitä ole kuin muutama maininta koko tekstissä?
Lisäsin tuon, notta "asennuksen osalta".
Tämähän on siis ihan perusopas, ei kaiken kattava manuaali kaikista funktiosta. Voisihan noita tietysti sinne Putkan hakemistoon lisäillä. Eri algoritmeista löytyy infoa kun seuraa hieman linkkejä: mcrypt kotisivu -> NIST: Cryptography pages. Numeroista kryptausfunktioiden lopussa voi päätellä salauksen vahvuuksia. Voisin kyllä laittaa tuosta mcryptista ainakin yhden lisäesimerkin kunhan sellaisen kerkeän vääntäistä.
Kun mainitsin että MD5 saa liikaa huomiota, tarkoitin yleisesti, en suinkaan tätä opasta. Aina kun puhutaan salaamisesta, oppaan tai tutoriaalin kirjoittaja yleensä menee siitä missä aita on matalin ja puhuu vain MD5:stä, vaikka vaihtoehtoja on mielinmäärin, joista monet voivat olla (olosuhteista riippuen) parempia kuin MD5. Tämä ei ollut mikään kritiikki tätä opasta kohtaa, vaan enemmänkin ylistystä että puhuttiin jostain muustakin vaihteeksi.
Tuo yhteensopivuus alustojen kanssa oli vain maininta, ehkä asia jonka olisi voinut mainita siltä varalta että joku uuno ei ymmärrä heti. Sitä tapahtuu joka kerta.
Tarkoitukseni tässä oli vain antaa rakentavaa palautetta, sen varalta että parantelet tätä opas, jossain vaiheessa. Jopa perusoppaan kannattaa hiukan mainita johonkin suuntaan että, "tää on huono, tää on parempi" ja sitten siihen perään lyhyt rivi miksi. Mielestäni se on huonon oppaan tapa ottaa asioita esille ja sitten sano että "tästä suunnasta voi lukea lisää". Huonoimmissa tapauksissa linkki osoittaa -> google.fi.
En nyt tarkoita että eri algoritmejä olisi tarvinnut listata ja selittää täydellisyydessään, mutta hiukan ohjastusta että, "tää yks on ainakin hyvä" olisi mielestäni ollut tarpeellista. Sekään ei välttämättä tarkoita paljon kaikille että tietää että vahvuus 128 bittiä.
No, enivei, pidin oppaasta kuitenkin.
Kiitos palautteesta.
Täytyy tunnustaa, että en ole tutustunut kuin murto-osaan mahdollisista algoritmeista, joten en viitsi mitään mutu-tietoa lähteä esittelemään. Voin kyllä etsiä muutaman linkin ja katsoa, josko löytyisi noista jotain infoa. Tuolla mcryptin kotisivuilla on ominaisuustaulukko, ja siellä Panama-algoritmin sanotaan reputtavan testissä - en sitten tiedä millaisesta testistä on kyse. Korjatkaa ihmeessä jos olen väärässä, mutta mitä suurempi vahvuusluku ('block size'), sitä vahvempi kyseinen algoritmi on verrattuna heikommalla vahvuusluvulla varustettuun samaan algoritmiin.
PHP:n manuaalissa oli muutama valmis koodi, jolla pystyi testaamaan mcryptin eri algoritmeja ja innostuin niistä kirjoittamaan oman testikappaleen, jolla voi testata asennuksen onnistumisen ja nähdä millaisia kryptauksia eri salausmenetelmät tuottavat. Päivitän sen ehkä joskus vielä oppaaseen.
Päivitinpä oppaaseen hieman asiaa. Vaihdoin osan "hash"-nimityksistä "summaan", ja tein enemmän pesäeroa hashien laskemisen ja kryptauksen välille. Lisäksi kirjoittelin hieman tuon ECB-tilan varjopuolista.
Päivitetty. PHP:n vitosversiossa asiat ovat näköjään muuttuneet, niistä kirjoittelin jotain. Kunhan kerkeän niin lisään tähän vielä asiaa gnupg:stä. Päivitin myös linkit.
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.