[php]crypt()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
ik wordt echt helemaal lijp hier :(

Ik heb een cgi script dat gebruikers toevoegt aan een .htpasswd die in een beveiligde dir staat.

Nou wil ik een php script maken waarbij je eerst de login gegevens moet invullen in een formuliertje, en daarna check het php script of de user/pass kloppen (dus username en password vergelijken met de user/pass die in de .htpasswd staan) en als dat klopt dan doorsturen naar de beveiligde dir dmv login:pwd@domein.com/dir

Op deze manier weten dus alleen de mensen die toegang hebben wat de beveiligde directory is. Het login-formulier is alleen toegankelijk vanaf het domein (dmv van een sessie).

Op deze manier kunnen dus nooit meer brute force attacks op de beveiligde diretory worden los gelaten, tenzij de aanvaller de beveiligde directory weet, maar dan rename je die gewoon weer ff. het script dat ik aan het maken ben moet dus kijken of de l/p goed zijn, en als dat niet het geval is terugsturen naar de root.

Probleem is dat ik het passwoord niet goed ge-encrypt krijg :(
Dit is een stukje van het cgi script:

code:
1
2
3
4
5
6
7
    $password = &docrypt($password);
   -stukje waar die in de htpasswd wordt gezet-
sub docrypt {
    local($text) = @_;
    return ($text) if ($ignorecrypts);
    return crypt($text,substr($text,-2));
}


Nou, volgensmij gebeurt er dus niks meer dan wat in php zou zijn crypt($pwd) :?
Als ik dat echter doe, krijg ik elke keer weer opnieuw een ander password. Ik heb al gezocht op GOT en op php.net, o.a. naar de functie crypt() maar ik kom er niet uit. Ik lees dingen over "salt" maar echt duidelijke uitleg vind ik niet.

Kan iemand mij vertellen hoe ik dit nou kan doen?

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Crypt is een one-way encrypting methode, vergelijkbaar met MD5. Echter, crypt gebruikt zogenaamde 'salt' om de encryptie op te baseren. Je moet dus steeds dezelfde salt gebruiken lijkt mij :) www.php.net/crypt zegt erover:
If the salt argument is not provided, one will be randomly generated by PHP.

[ Voor 24% gewijzigd door MisterData op 14-12-2002 18:06 ]


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
dus in dat cgi script is

code:
1
@_;


de salt?

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
MisterData schreef op 14 December 2002 @ 18:06:
Crypt is een one-way encrypting methode, vergelijkbaar met MD5. Echter, crypt gebruikt zogenaamde 'salt' om de encryptie op te baseren. Je moet dus steeds dezelfde salt gebruiken lijkt mij :) www.php.net/crypt zegt erover:


[...]
maar dan moet die salt toch gelijk zijn met de salt die htpasswd gebruikt, anders klopt het nooit natuurlijk

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
FireFoz schreef op 14 December 2002 @ 18:51:
[...]


maar dan moet die salt toch gelijk zijn met de salt die htpasswd gebruikt, anders klopt het nooit natuurlijk
Tjsa... hoe htpasswd het doet weet ik niet, dat zul je bij Apache moeten nalezen (http://httpd.apache.org). Verder dacht ik altijd dat htpasswd met md5 werkte?? Probeer anders es met het tooltje htpasswd te werken (staat in de bin map van Apache) in plaats van de .htpasswd direct zelf te schrijven :?

Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
nou dat script doet het ook rechstreeks zelf, dus opzich zou het gewoon moeten kunnen.het script doet het ook met crypt (zie code hierboven)
$text wordt verder echter niet gevuld oid :?

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

Verwijderd

FireFoz schreef op 14 December 2002 @ 17:33:

code:
1
2
3
4
5
6
7
    $password = &docrypt($password);
   -stukje waar die in de htpasswd wordt gezet-
sub docrypt {
    local($text) = @_;
    return ($text) if ($ignorecrypts);
    return crypt($text,substr($text,-2));
}


Kan iemand mij vertellen hoe ik dit nou kan doen?
code:
1
    local($text) = @_;

dit zorgt ervoord at het argument dat je meegeeft ($password) in $text wordt gestopt, en dat die var alleen in die sub geldig is.

code:
1
    return crypt($text,substr($text,-2));

dit zorgt ervoor dat $text wordt geript met als salt de laatste 2 letters van het wachtwoord($text)
substr EXPR,OFFSET,LENGTH,REPLACEMENT

If OFFSET is negative (or more precisely, less than $[), starts that far from the end of the string.
zie voor meer info:

http://www.perldoc.com/perl5.6/pod/func/substr.html

Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Ok dat begrijp ik. Maar wat ik nou niet begrijp nog, is het volgende.

Bijkbaar is elke ge-encrypte regel dus mede-gebaseerd op de salt. Als ik nou als wachtwoord "hallo" gebruik, en dit met crypt() codeer en als salt "ab" gebruik, krijg ik bijvoorbeeld als uitkomst "hjdf7832najks23".

Als ik een andere salt gebruik, krijg ik een andere uitkomst. In dit geval is de salt dus gebaseerd op het wachtwoord, dus voor elk wachtwoord een ander salt. Hoe weet apache met htaccess/passwd nou welke salt er gebruikt is? Gebruikt die dan ook standaard de laatste 2 tekens van het wachtwoord?

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
hmm als ik nu dus die laatste 2 karakters van het paswoord gebruik als salt krijg ik toch nog een ander wachtwoord dan dat in de .htpasswd staat :/

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Kan je ook executables aanroepen? Oftewel kan je dit
PHP:
1
system('htpasswd -nb jantje geheim');

Ik zou echt voor deze oplossing gaan. De crypt functies willen op verschillende os'en nogal anders werken (bv freeBSD en linux geven soms andere resultaten ook al gebruiken ze wel crypt(), windows gebruikt altijd MD5). Op deze manier weet je zeker dat de genereerde username/wachtwoord ook valide is op het systeem waarop je het maakt.

Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
ik heb het :D

de salt is "18"

ik heb een aantal salts geprobeerd en kwam er op een gegeven moment achter dat de er nogal vaak "18" in de htpasswd file zat. Toen heb ik ff crypt($pwd, 18); gedaan en tadaa: dat klopt precies met wat er in .htpasswd staat :D

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

Verwijderd

de salt vind je terug in de eerste twee tekens van het geencrypte password

Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
hmm dis lijp, ik heb nu:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        $lines = file(".htpasswd");

        $i=0;
        $temp[0] = 1;
        $pwd2= crypt($pwd,18);

        while($temp[0] != (NULL))
        {
            $temp = split(":",$lines[$i]);

            if($temp[0]==$user)
            {
                print("user ok");

                if($temp[1]==$pwd2)
                {
                    print("pwd ok");
                }
            }
        }



het gekke is dat de username wel als gelijk wordt gezien, maar het paswoord niet, terwijl als ik ze beide print op het scherm ($temp[1] en $pwd2) ik hetzelfde als uitkomst krijg :?

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
check je strings even op spaties, \r en \n (trimmen)

Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
oja :)
tnx voor de tip, ff proberen

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
hmm iemand een id waarom header location("http://user:paswoord@domein.nl/directory"); niet werkt?
hij stuurt hem wel door, maar logt niet automatisch in...

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
hmm ik kan er bijzonder weinig over vinden maar volgensmij is het niet mogelijk :'(

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
tis niet mogelijk, want volgens mij is t geen protocol standaard en puur een feature die door een aantal browsers word ondersteund, correct me if i'm wrong.

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

zend dan gelijk user en password headers, en daarna pas de location? (of zoek daar de goeie volgorde ff voor)

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

M4rt1nvW schreef op 15 December 2002 @ 19:40:
tis niet mogelijk, want volgens mij is t geen protocol standaard en puur een feature die door een aantal browsers word ondersteund, correct me if i'm wrong.

Dat valt wel degelijk onder de RFC, dus of het username/pass is niet goed, of er gaat iets anders mis. Maar de string ansich is niet perse fout.
Pagina: 1