Kirjautuminen

Haku

Tehtävät

Opasarkisto: PHP: Salausopas (Mhash, Mcrypt ja Crack)

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

autentikointitunnisteauthentication code
tiivistehash value
tarkastussummachecksum
viestikoostemessage digest

Näistä kaikista opas käyttää joko suomenkielistä nimitystä summa, tai englanninkielistä yhteisnimitystä hash.

Mhash

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])

hashjokin tuetuista hash-menetelmistä (kts. manuaali)
datasalattava data
avainvalinnainen 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.

Mcrypt

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)
avainavain, jolla data kryptataan
datakryptattava data
tilajokin valmiista kryptaustilavakioista (kts. manuaali)
ivValinnainen 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);

?>

Crack

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:

Kommentit

sooda [17.07.2004 16:31:30]

#

Kiva tietää muistakin ku md5:stä, mutta on sekin varmaan aika turvallinen... :)

tsuriga [01.09.2004 15:49:42]

#

It-viikko: Suositut kryptausmenetelmät haavoittuvia

Kyllä sillä md5:llaki silti pärjää, kunhan muistaa käyttäjähkohtaiset suolat.

markdark [01.09.2004 20:31:16]

#

// 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ä.

Tomi [22.10.2004 16:11:36]

#

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.

tsuriga [23.10.2004 01:37:08]

#

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ä.

Tomi [23.10.2004 10:09:22]

#

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.

tsuriga [23.10.2004 15:08:03]

#

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.

tsuriga [28.06.2006 12:37:07]

#

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.

tsuriga [14.10.2007 01:58:50]

#

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.

Kirjoita kommentti

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.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta