Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP Mcrypt

qeijo [07.01.2012 12:39:14]

#

-

Metabolix [07.01.2012 13:02:57]

#

Ei, dekryptauksessa iv:n pitäisi tulla datan mukana. Jos aina arvot uuden, purku ei tietenkään voi onnistua. Tämä on ihan kryptauksen perusasia eikä riipu mcryptista mitenkään.

Tästä voidaan edelleen johtaa päätelmä, että staattinen $iv-muuttuja ei ole järkevä ratkaisu.

qeijo [07.01.2012 13:11:19]

#

Metabolix kirjoitti:

Ei, dekryptauksessa iv:n pitäisi tulla datan mukana. Jos aina arvot uuden, purku ei tietenkään voi onnistua. Tämä on ihan kryptauksen perusasia eikä riipu mcryptista mitenkään.

Tästä voidaan edelleen johtaa päätelmä, että staattinen $iv-muuttuja ei ole järkevä ratkaisu.

Ok, voinko tallentaa iv:n ja kryptatun stringin käsittelemättömänä kantaan? Vai pitääkö ne ajaa ensin jonkun encode/decode - n lävitse?

timoh [07.01.2012 16:44:42]

#

Lyhyesti sanottuna xxxCrypt on monella tapaa puutteellinen ja tekee asioita väärin. Päällisin puolin ainakin seuraavat asiat tulisi laittaa kuntoon:

-autentikoinnin puute
-epästandardin algoritmin käyttö
-ECB-moodin käyttö
-IV:n luonti/toteutus
-avain ($key) on tuskin sellainen mitä sen pitäisi olla

En tähän vielä jorise noista mainitsemistani asioista tämän enempää, mutta jos joku kohta jää epäselväksi niin palaan sitten asiaan.

p.s. IV:n voit tallentaa ciphertextin kanssa sellaisenaan samaan pötköön. Se että voitko ne tallentaa kantaan sellaisenaan riippuu siitä millaista materiaalia voit tallentaa tauluusi (esim. haittaako binääridata hommaa jossain kohtaa).

qeijo [07.01.2012 17:10:41]

#

-

timoh [07.01.2012 17:36:12]

#

Pahoittelut tarkempien tietojen puutteesta, mutta en tiennyt mistä kohdista tarkempaa tietoa kaivataan joten en sitä umpimähkää ruvennut suoltamaan.

Rijndael 256 bittisellä blokkikoolla ei ole standardi. Käytä ennemin AES:ia (MCRYPT_RIJNDAEL_128).

ECB-moodia ei tulisi käyttää käytännössä ikinä (periaatteessa se toimii jos encryptaat vain yhden blokin kokoisia pötköjä, mutta näin tuskin on). Pelaa varman päälle ja käytä ennemmin CBC-moodia (randomilla IV:llä). Luo IV:t käyttäen vahvaa satunnaisdataa, esim. openssl_random_pseudo_bytes(), /dev/urandom tai mcrypt_create_iv() MCRYPT_DEV_URANDOM:lla.

Mitkään Mcryptin tarjoamista moodeista ei autentikoi ciphertextiä, joten sinun täytyy tehdä se "vanhanaikaisesti", eli HMAC:lla. Esim. hash_hmac PHP:ssä. Ja tee autentikointi vielä "encrypt-then-mac" muodossa (näin estät että missään tapauksessa mahdollisesti haitallista "koodia" ei pääse decryptattavaksi (mistä voisi avautua heikkouksia)).

Jos päädyt käyttämään AES:ia (mitä suosittelen), niin avaimen tulee olla 128-, 192-, tai 256-bittinen. Tuossa kun käytät $key-muuttujaa, ei käy mitenkään ilmi täyttääkö avain tämän kriteerin (olkoonkin että Mcrypt automaagisesti lisää avaimeen padding-tavuja jos avain ei ole oikean kokoinen, mutta näin ei tietenkään saisi käydä, se on pelkkää humpuukia automagiaa).

Jos $key tulee jostain käyttäjän määrittämästä config-parametrista tjms. tai on muuten ihmisen luoma, sinun olisi hyvä muokata avainta esim. PBKDF2:n osoittamalla tavalla:
http://en.wikipedia.org/wiki/PBKDF2

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta