_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/crypt - vienos krypties passwd stiliaus enkryptinimas

  • crypt PLAINTEXT,SALT

    Užšifruoja string'ą taip pat kaip crypt(3) funkcija C bibliotekoje (tariant, kad turima versija ne iš tų, kurios buvo panaikintos kaip galimai pagerintos(?). Tai gali pasirodyti naudinga tikrinant slaptažodžių failus, ieškant bjaurių slaptažodžių (čia tarp daugelio dalykų). Tik vyrukai baltomis skrybėlėmis (white-hats'ai) turėtų taip daryti:).

    Pažymėtina, kad crypt numatoma kaip vienpusė funkcija, kaip kad daužomi kiaušiniai, norint pasigaminti kiaušinienę. Nėra jokios (žinomos) atšifravimo funkcijos (kitais žodžiais tariant, crypt() yra vienkryptė hash'inė funkcija). Rezultate funkcija nėra tokia jau naudinga kriptografijai. (Jei norima to, reiktų peržiūrėti artimiausią CPAN mirror'ą.)

    Kuomet tikrinama egzistuojantis užšifruotas string'as, reiktų naudoti užšifruotą tekstą kaip SALT (kaip crypt($plain, $crypted) eq $crypted ). Tai leidžia kodui dirbti su standartine crypt su egzotiškesniu įgyvendinimu. Kitais žodžiais tariant, nereiktų nieko svarstyti apie gražintą string'ą ar kiek baitų užšifruotame string'e iš tikrųjų kažką reiškią. /p>

    Tradiciškai, rezultatas yra 13 baitų stringas: pirmi du baitai iš SALT, o po jų - 11 baitų iš rinkinio [./0-9A-Za-z], ir tik pirmi aštuoni užšifruoto string'o baitai turėjo reikšmę, bet alternatyvios hashinimo schemo (kaip MD5), aukštesnio lygio saugumo schemos (kaip C2) ir įgyvendinimai ne-UNIX'inėse platformose gali duoti skirtingus string'us.

    Pasirenkant naują SALT, sukurkite atsitiktinį dviejų simbolių string'ą, kurio simboliai yra iš [./0-9A-Za-z] (kaip join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64] ). Šis simbolių yra rinkinys yra tik rekomendacija; simboliai, leidžiami SALT priklauso tik nuo naudojamos sistemos šifravimo bibliotekos, o Perl'as negali negali reguliuoti kokius SALT'us crypt() prisiima.

    Štai pavyzdys, kuris užtikrina, kad kiekvienas, kuris paleidžia programą, žino savo slaptažodį:

        $pwd = (getpwuid($<))[1];
        system "stty -echo";
        print "Password: ";
        chomp($word = <STDIN>);
        print "\n";
        system "stty echo";
        if (crypt($word, $pwd) ne $pwd) {
    	die "Sorry...\n";
        } else {
    	print "ok\n";
        }

    Be abejo, rašyti savo slaptažodžius visur, kur to prašoma yra neprotinga.

    Crypt funkcija yra netinkama dideliems duomenų kiekiams šifruoti, be abejo dar ir dėl to, kad paskui negalima savo informacijos atgauti. Užmeskite akį į by-module/Crypt ir by-module/PGP direktorijas mylimiausiio CPAN mirror'o, norėdami sužinoti apie gausybę potencialiai naudingų modulių.

    Naudojant crypt() Unicode string'uose (kurie gali ir greičiausiai turi simbolių, kurių kodas aukščiau nei 255), Perl mėgina suprasti situaciją, stengdamąsis "nužeminti" (string'o kopiją) string'ą atgal į aštuonių bitų string'ą, prieš iškviečiant crypt() (dirbti su ta kopija). Jei tai veikia, gerai. Jei ne - crypt() išeina su Wide character in crypt .

algirdas@perl.lt 2005.04.11 - $dabar