-
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.
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?
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).
-
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.