Labas,
manjana wrote:Sweiki, viename is forumu man pasake
jog uzkodaves skaiciu md5() funkcijos pagalba niekad to skaiciaus ne decoduosi...
Tu php.lt forume rašei, cituoju:
Aisku darant savo svetainei negalima perdavineti $_GET metodu. Geriausiai tai slepti su postais,hidden ar md5() funkcija kaip kam patinka.
Tau kažkas kažką rašė php.lt forume. Cituoju:
post ir hidden nėra slėpimas, o iš md5 kainos neiškrapštysi, tai neverta net bandyti taip perdavinėti.
šiuo atveju, kalbant konkrečiai apie md5() algoritmą, reikia nepamiršti, kad tai yra vienkryptė funkcija, ir kad ir ką su ja "užkoduosi", "atkoduoti" galėsi tik parinkinėdamas visus variantus (arba naudotis sugeneruotais žodynais/duomenų bazėmis). žodžius "koduoti" ir "dekoduoti" vartoju kabutėse, nes kalbant apie md5() ir panašius algoritmus labiau tiktų naudoti tokius terminus kaip: "maišos kodas", "santrauka" ir pan. Tolimesniame tekste dėl bendro susikalbėjimo naudosiu tavo terminus :)
Taigi žmogus parašęs, kad užkodavęs su md5() nelabai dekoduosi dalinai buvo tesus, bet kartu dalinai ir neteisus - čia turint omenyje, kad kalbama abstrakčiai, nesigilinant nei į duomenų ilgį ir įvertinant tai, kad kalbama apie standartinį funkcijos md5() panaudojimą.
manjana wrote:Pagalvojau ir sukuriau ....
Cia yra klase kuri koduoja ir decoduoja teigiamus skaicius.
Peržvelgus algoritmą darosi aišku, kad tavo sukūrtas algoritmas nėra įrodymas, kad galima dekoduoti md5() užkoduotus duomenis. Kodėl? Ogi todėl, kad pas tave yra naudojama mišrus abėcėlės ir kažkokių veiksmų algoritmas. md5() funkcija čia naudojama tik kaip pagalbinė funkcija generuoti abėcėlei. Vietoje jos gali būti bet kuri kita funkcija, tiek standartinė - plačiai žinoma - tiek tavo pačio sugalvota. šiuo atveju aš visiškai palaikau vieno iš komentatorių nuomonę, cituoju:
Tai nebus saugu, nes tai yra "security through obscurity" - saugu, kol niekas nežino kaip veikia.
Tik papildysiu, kad tokie mėginimai sukurtį kažkokį tai saugų algoritmą yra praktiškai betiksliai, nes žmonės, dirbandys su kriptografija tokius algoritmus sulaužys kaip degtukus. Viena iš pagrindinių taisyklių dirbant šioje srityje yra: "Nekurk savo kriptografijos algoritmų, jeigu nesi šios srities profesionalas".
Taigi vertindamas šitą parašymą:
manjana wrote:Uzkodaves taip skaiciu ji galima perduoti ir su POST ir su HIDDEN ir GET metodu pagalba, ir tai bus saugu.
.. noriu pasakyti, kad jis yra neteisingas, ir duomenys bus tikrai nesaugūs. Toks teiginys tiesiog klaidina naujokus sudarydamas neteisingą "saugumo" jausmą.
Toliau.. kadangi pateiktas pavyzdys gali būti traktuojamas tik kaip PHP sintaksės bei algoritmavimo mokymasis, tai ties tuo ir pakomentuosiu:
a) lieku prie savo ankčiau išsakytos nuomonės, kad kintamojo kūrimas konstruktoriuje gali būti ydingas, ir tai reikėtų iškelti į klasės header'į.
b) toliau tie visi dinaminiai pirminių reikšmių užpildymo (abėcėlės sudarymo) algoritmai iš esmės yra gerai, bet konkrečiu atveju rekomenduočiau naudoji jau užpildytą masyvą, kad kas karta veikiant algoritmui nebūtų viskas dinamiškai generuojama. Kitaip sakant klasės antraštėje iš karto galima deklaruoti pirminius duomenis:
$all_val = array(
[0] = "jf34kjh235kjy45y34y346";
[1] = "jf34kjh235kjy45y34y435";
...
);
c) eiliutę:
$var=preg_split('//',$var,-1,PREG_SPLIT_NO_EMPTY);
siūlau keisti į:
d) kodą:
foreach($this->flipped as $mad=>$var)
{
$str1=str_replace($mad,$var,$str1);
}
gaima laisvai keisti į:
$str1 = str_replace($this->all_val, $this->flipped, $str1);
e) Iš principo neteisingai naudoji "konstrutoriaus" mechanizmą, nes naudoji savo sugalvotą konstruktoriaus veikimą. Užtenka klasėje sukurti metodą, tokiu pačiu pavadinimu kaip ir klasė, ir tas metodas bus vykdomas objekto sukūrimo metu automatiškai (PHP4 atveju) arba naudoti __construct() metodą (PHP5 atveju). Dėl bendro suderinamumo, norint, kad kodas gana sėkmingai veiktų tiek PHP4 tiek PHP5 varikliuose rekomenduoju naudoti pirmąjį variantą, nes jis yra palaikomas ir PHP5.
f) Taip pat manau, kad iš principo pats algoritmas yra neteisingas, nes jeigu patestuotum su daug įvairių sveikių skaičių, tai rastum atvejus, kai duomenys bus neteisingai dekoduojami. Tai įvyks dėlto, kad tu naudoji papildomą simbolį (raidę, konkrečiu atveju tašką (.)) kaip skaičių skiriklį. Yra nemaža tikimybė, kad greitai susidarys tokia situacija, kai skiriklio dalis su šalia esančio skaičiaus dalimi sudarys tokią pačia kaip skiriklio santrauką (hash'ą) ir tavo skaičius bus neteisingai sukapojamas. šitą dalyką galima ištaisyti nenaudojant jokio skiriklio, o tiktai skaidant eilutę į gabalus po 32 simbolius (nes md5() funkcijos rezultatas yra 32 simbolių eilutė).
g) Turint omenyje, kad pats rekomenduoji šiuos duomenis perdavinėti per GET/POST nėra jokio funkcionalumo, kurio pagalba būtų galima patikrinti ar gauta eilutė yra tikrai tavo funkcijos užkoduoti duomenys, nėra net eilinės validacijos.
Pradžiai tiek. (-;