Koostin pienen jutun satunnaislukujen luonnista PHP:lla. Ja ennen kaikkea tähän liittyvistä ongelmista ja muista erikoisuuksista mitä on syytä tiedostaa asian tiimoilta:
http://timoh6.github.io/2013/11/05/Secure-random-numbers-for-PHP-developers.html
En oikein ymmärrä, mikä on tekstisi kohderyhmä: teksti tuntuu niin epäselvältä, että tuskinpa siitä juuri mitään ymmärtää, jos ei tiedä asioita aika hyvin jo valmiiksi. Epämääräisyyden vuoksi jäi epäilyttämään, hahmotatko edes itse kunnolla tuota OpenSSL:n ongelmaa, josta yrität kertoa.
Jännää, että HAVEGE ja sitä kautta haveged ei ole sinulle tuttu.
Aivan aloittelijoille ei tästä luultavasti ole liiemmin hyötyä. Päivityksenä lisäsin kappaleen "Conclusion" artikkelin loppuun (en ole varma oliko tuo päivitys lisätty vielä silloin kun linkin tänne laitoin). Mutta kerro ihmeessä mitä miellät epäselväksi, niin katsotaan olisiko aihetta päivitykselle.
Aika useasti PHP-piireissä näkee, että suositellaan openssl_random_pseudo_bytes-funktion käyttöä, ilman sen suurempaa ajatusta. Ja se, että jalostetaan itse "parempia satunnaislukuja" (useammasta lähteestä, heikoista..vahvoista.. who knows) tuntuu olevan yleistä.
Tällaisia asioita kannustan ajattelemaan uudelleen.
Mitä OpenSSL:ään tulee, niin kuten kirjoitin, tuskin yksikään tietoturvaekspertti pitää OpenSSL:n tapaa pulauttaa satunnaisdataa hyvänä. Siinä on todella hyvä argumentti valita joku toinen vaihtoehto (mikä on kaikessa yksinkertaisuudessaan /dev/urandom).
Haveged ei tosiaan ole tuttu, mutta en olekaan sentään mikään Jyrki Otila! ;)
Mielestäni tekstin suurin ongelma on esitystapa. Teksti on tasapaksua, avainkohdat eivät erotu, ja koko kirjoituksen tarkoitus tai sanoma jää epäselväksi. Siis tuntuu, että kirjoittaja vain pohdiskelee ilman kunnollista päämäärää. Alla on muutama päällimmäiseksi mieleen noussut tyylivinkki.
Voisit tuoda paljon selvemmin esiin, mitä huonoa tai hyvää missäkin vaihtoehdossa on. Nyt perustelut tuntuvat jotenkin laimeilta, ja vielä pehmentelet sanojasi.
On tärkeää, että kunkin kappaleen tai muun tekstikatkelman pääasia kerrotaan heti alussa. Seuraavat virkkeet voivat sitten avata asiaa jossain loogisessa järjestyksessä. Nyt esimerkiksi OpenSSL-juttu alkaa hyvin epämääräisesti; olisi selvempää aloittaa suoraan lauseesta ”OpenSSL has a horrible track record for security” ja sitten vähän avata, mitä funktioita käytetään ja mikä niissä on vikana.
Väliotsikoiden kannattaa olla tarpeeksi lyhyitä mutta täsmällisiä. Funktion nimi ”openssl_random_pseudo_bytes” on turhan pitkä otsikkoon (ja leipätekstiinkin toistuvana), ja muutenkin tilalle sopisi paremmin termi OpenSSL: ethän ilmeisesti suosittele muitakaan OpenSSL:n funktioita, vaikka mainitset nimeltä vain yhden. Otsikko ”Anything else?” taas ei kerro mitään.
Täytynee jossain vaiheessa kirjoittaa Putkaan koodivinkki PHP:n satunnaisluvuista.
Tekstissä olisi hyvä kertoa, mitä kryptografisesti turvallinen satunnaisuus tarkoittaa ja miksi sellaista tarvitsee PHP-ohjelmoinnissa.
Esimerkiksi miksi funktio mt_rand ei riitä? Jos käyttää sitä käyttäjän salasanan generointiin, niin mikä konkreettinen ongelma syntyy?
Ainakin Wikipedian määritelmä kryptografisesta turvallisuudesta tuntuu kaukaiselta käytännön PHP-ohjelmoinnin kannalta. Jos on olemassa O(n^10)-aikainen algoritmi, joka ennustaa seuraavan bitin todennäköisyydellä 60 %, niin mitä tämä haittaa salasanan generoinnissa?
Lisäksi varoisin vetoamasta ekspertteihin ja puhumasta suulla suuremmalla. Ovatko asiat todella niin monimutkaisia, ettei kansalle voi kertoa niistä suoraan?
Metabolix: point taken. Teksti on tosiaan tarkoituksella "laimeaa" ja pyrin herättämään ajatuksia, tyyliin "oletko ajatellut tätä. Mutta en yhtään enempää.
OpenSSL:n funktioihin liittyen, kyse on ainoastaan juuri openssl_random_pseudo_bytes-funktiosta. Tämä voisi olla paremmin mainittu.
"Anything else?" ei kerro itsessään paljoa, maininta kappaleen sisällöstä toimisi tosiaan paremmin.
Antti Laaksonen: teksti on suunnattu sen verran kokeneemmalle lukijalle, että en nähnyt tarpeelliseksi tarkentaa "kryptografista satunnaisuutta". Voi olla, että olisi ollut parempi avata tätä puolta edes hiukan.
mt_rand-funktio "murtuu" liian helposti. Esimerkki ongelmasta liittyen mm. PHP-sovelluksiin: http://phpsecurity.readthedocs.org/en/latest/
Kryptografiassa ekspertteihin luottaminen on miltei ainoa vaihtoehto. Asiassa ei sinänsä ole mitään salaista tai mystistä, mutta monimutkaisuutta senkin edestä. Tästä johtuen omin päin tehdessä ampuu itseään jalkaan:
Se että meillä on tänä päivänä käytössä (tiettävästi) turvallisia salausalgoritmeja, tiivistefunktioita, satunnaislukugeneraattoreita yms. on kymmenien vuosien työn tulos.
Ja peruskäyttäjään liittyen, sekin että näitä työkaluja pystytään käyttämään turvallisesti vaatii jo itsessään paneutumista asiaan (tai seuraamalla asiaan liittyviä standardeja ja suosituksia).
Ongelma on se, että asia on monimutkainen.
P.S. Jos asiaan haluaa paneutua enemmän, kannattaa katsastaa http://www.matasano.com/articles/crypto-challenges/
timoh kirjoitti:
Ongelma on se, että asia on monimutkainen.
Antti Laaksonen ei varmaan tarkoittanut, että pitäisi selittää perusteellisesti koko teoria. Muutama valikoitu perustelu riittää. Ihminen uskoo paremmin asioita, jotka voi itse kuvitella ymmärtävänsä. Eihän /dev/urandom mitenkään ole hyvä siksi, että ekspertit sanovat sen olevan hyvä. (Sitä paitsi olet juuri kertonut, että eksperttien tekemä OpenSSL on buginen roska.) Sen sijaan monet eksperttien perustelut on mahdollista kertoa hyvin lyhyesti ja kansantajuisesti.
timoh kirjoitti:
OpenSSL:n funktioihin liittyen, kyse on ainoastaan juuri openssl_random_pseudo_bytes-funktiosta. Tämä voisi olla paremmin mainittu.
Kuitenkin perustelunasi käytät yleisesti OpenSSL:n huonoa historiaa, ja ainoa erikseen mainitsemasi bugi ei luultavasti edes koske PHP:tä, ellei Apachen ja mod_php:n yhdistelmässä tapahdu jotain aivan käsittämätöntä OpenSSL:n kanssa.
Metabolix kirjoitti:
Antti Laaksonen ei varmaan tarkoittanut, että pitäisi selittää perusteellisesti koko teoria. Muutama valikoitu perustelu riittää. Ihminen uskoo paremmin asioita, jotka voi itse kuvitella ymmärtävänsä.
Mielstäni edellisessä viestissäni oleva readthedocs.org -linkki on aika hyvä juuri tällaiseen konreettiseen havainnointiin.
Metabolix kirjoitti:
Eihän /dev/urandom mitenkään ole hyvä siksi, että ekspertit sanovat sen olevan hyvä. (Sitä paitsi olet juuri kertonut, että eksperttien tekemä OpenSSL on buginen roska.)
Ei tietenkään, mutta minusta on aika selvää, että jos juuri expertit ja asiasta perillä oleva yhteisö sattuvat suosittelemaan asiaa X, niin se kertoo kuitenkin jo jotain.
OpenSSL ei ole missään nimessä "experttien tekemä". Voisi sanoa että päin vastoin, ainakin alkujaan:
http://blog.cryptographyengineering.com/2013/09/
Unfortunately while OpenSSL is open source, it periodically coughs up vulnerabilities. Part of this is due to the fact that it's a patchwork nightmare originally developed by a programmer who thought it would be a fun way to learn Bignum division.* Part of it is because crypto is unbelievably complicated. Either way, there are very few people who really understand the whole codebase.
Tässä tietysti kyse OpenSSL:stä kokonaisuutena. Mutta kuitenkin on hyvä muistaa että mihin PHP:n tarjoama openssl_random_pseudo_bytes pohjautuu.
Metabolix kirjoitti:
Kuitenkin perustelunasi käytät yleisesti OpenSSL:n huonoa historiaa, ja ainoa erikseen mainitsemasi bugi ei luultavasti edes koske PHP:tä, ellei Apachen ja mod_php:n yhdistelmässä tapahdu jotain aivan käsittämätöntä OpenSSL:n kanssa.
Alla OpenSSL "PRNG Is Not (Really) Fork-safe" -artikkelista:
http://emboss.github.io/blog/2013/08/21/openssl-prng-is-not-really-fork-safe/:
Saarinen discovered a flaw in the PRNG more than a decade ago. Because of the ad-hoc design, who is to say that this has been fixed for good?
Suomeksi sanottuna, se että OpenSSL:n tarjoama funktio mahdollisesti toimii reaalitilanteissa, ei silti välttämättä tarkoita että se olisi erityisen hyvä vaihtoehto.
Niin, tuonkin kaiken voisit kertoa artikkelissasi. On aika turhaa tehdä artikkeli, jossa ei ole selvää sisältöä eikä kummoisia perusteluja, ja kirjoittaa sitten selitykset ja perustelut johonkin foorumille. Tai jos tämä oli todella artikkelisi tarkoitus, olisit voinut tiivistää sen näin: ”Kaikki satunnaisluvut eivät ole kryptografisesti vahvoja. Ottakaapa selvää asiasta!”
Koin riittäväksi OpenSSL:n osalta linkittää ainoastaan kahteen blogiin.
Metabolix" kirjoitti:
...Tai jos tämä oli todella artikkelisi tarkoitus, olisit voinut tiivistää sen näin: ”Kaikki satunnaisluvut eivät ole kryptografisesti vahvoja. Ottakaapa selvää asiasta!”
Väärin arvattu. Tietysti myönnän että ilmaisua voi aina parantaa, mutta näyttää myös että sinun olisi ollut syytä lukea teksti hieman tarkemmin.
Linkittäminen muihin materiaaleihin on kuitenkin aika kätevää netissä, joten en näe että minun kannattaa kaikkea laittaa lainauksina tekstini sekaan, helpompi laittaa linkki.
timoh kirjoitti:
näyttää myös että sinun olisi ollut syytä lukea teksti hieman tarkemmin.
Luin tekstin aivan tarkasti, kiitos vain. Näyttää, että et ymmärrä retoriikkaa foorumilla. Entä oletkohan ymmärtänyt, että en kaipaa tekstiin parannuksia itseäni varten vaan muita lukijoita varten?
Tässä on lyhennelmä tekstistäsi. Siinä pyrin kuvaamaan, mikä viesti tekstistäsi välittyy. Toivottavasti hetken mietit, mitä tässä lukee ja miksi tekstistäsi saa tällaisen kuvan.
Lyhennelmä kirjoitti:
PHP:ssä on monta tapaa tuottaa satunnaislukuja. Vain osa on turvallisia. Funktio openssl_random_pseudo_bytes voi toimia, mutta siinä on ehkä jotain vikaa nyt tai tulevaisuudessa. Omatekoisia satunnaislukuja voi olla mahdollista tehdä, mutta se on turhaa, ja siinä on bugin vaara. Linuxissa on valitettavasti tiedostot /dev/random ja /dev/urandom, joista /dev/random ei ole käyttökelpoinen ja tiedoston /dev/urandom käytöstä voi lukea lisää toiselta sivustolta. Eksperttien tekemä NaCl-projekti käyttää tiedostoa /dev/urandom. Satunnaisia kokonaislukuja on niin vaikea tehdä, että sitä on turha yrittää edes selittää kunnolla. Siihen voi käyttää Random Compat -kirjastoa, joka on kylläkin vähän huonosti suunniteltu. Yhteenveto: kannattaa valita luultavasti Random Compat, mutta tavuja voi lukea myös tiedostosta /dev/urandom tai generoida funktiolla mcrypt_create_iv sopivilla parametreilla.
Sanoin jo aiemmin, että pääasiat pitäisi kertoa ensin ja selvästi. Tekstisi on aivan päälaellaan: Vastustat funktiota openssl_random_pseudo_bytes ja omatekoisia lukuja, mutta molemmista sanot ensin, että saattaapa toimiakin. Sen sijaan yrität suositella tiedostoa /dev/urandom ja kirjastoa Random Compat, mutta ensin mainitusta kertova osa alkaa pahaenteisellä sanalla "unfortunately" ja jälkimmäisestäkin ainoa varsinainen kommenttisi on negatiivinen.
Linkkejä saa tietenkin käyttää, mutta ei tekstin sanoma voi olla niiden varassa. Eihän tieteessäkään kirjallisuuskatsaukseksi kelpaa vain lähdelista, vaan pitää olla myös omaa tekstiä, jossa kerrotaan pääasiat viitatusta aineistosta.
Toki saat kirjoittaa tekstisi juuri niin huonosti, kuin haluat. Eipä se ole minulta pois. Uskon kuitenkin, että suurin osa lukijoista, jotka lukevat tekstiäsi siinä luulossa, että saisivat hyvää tietoa satunnaisluvuista PHP:ssä, pettyvät karvaasti.
Metabolix kirjoitti:
Luin tekstin aivan tarkasti, kiitos vain. Näyttää, että et ymmärrä retoriikkaa foorumilla.
Ei suinkaan, kuten jo sanottua "point taken". Kiitoksia palautteesta molemmille.
Blogin päivittämistä en ymmärrettävästi voi pitää ykkösprioriteettina, joten muutama päivä kesti revision julkaiseminen. Mutta nyt kirjoitusta hieman päivitetty.
Olin luultavasti olettanut keskivertolukijan omaavan enemmän tietoa artikkeliin liittyvistä asioista, ja mm. tätä koitin nyt hieman avata enemmän.
Aihe on jo aika vanha, joten et voi enää vastata siihen.