[JS] MD5 en shadow op Linux

Pagina: 1
Acties:

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:29

hamsteg

Species 5618

Topicstarter
Hi,

Ik ben hier al een poosje mee bezig maar loop steeds weer vast. Voor een aantal bezoekers wil ik een speciale pagina vrijgeven. De huidige pagina is password protected maar de manier waarop maakt mij niet gelukkig oa omdat naast email er ook nog een login password moet worden onthouden. Het idee is nu om in een form Username en Password te vragen, 'onsubmit' beiden te encrypten en dan met de shadow file (die ook gebruikt wordt voor email) te vergelijken. Voor de rest van dit verhaaltje beperk ik me even tot alleen het password omdat voor deze een fixed salt aanwezig is. Als ik dit werkend krijg moet een random salt (server initiated) ook geen probleem meer zijn.

In de shadow file stond (password is weer iets wat niet te raden is) :
code:
1
$1$caGSSkwB$HFfuR.YJWJLu8EA7B6bOI.

Dit is een MD5 encryptie met salt. Ik heb het gecontroleerd met:
Bash:
1
openssl passwd -1 -salt caGSSkwB Holten
De optie -1 geeft aan dat het een MD5 is en de uitkomst is exact gelijk. Op de server kom ik dus op reproduceerbare resultaten.

Vervolgens JavaScript MD5 Source opgehaald en geinstalleerd om dan compleet vast te lopen.
JavaScript:
1
2
3
4
5
6
7
8
9
  hash = b64_hmac_md5("$1$caGSSkwB$", "Holten");
  document.write("<br>Value: ");
  document.write(hash);
  hash = b64_hmac_md5("caGSSkwB", "Holten");
  document.write("<br>Value: ");
  document.write(hash);
 
  Value: RngfQWGz3c3Mx2TVi+dsyw
  Value: aE+zgJoB1POyQh1uGN/fgg
Wat ik ook doe of probeer ik kom niet aan een gelijke hash als op mijn Linux bak ...

Uren zoeken levert niets op. Iedereen is heel gelukkig met de JavaScript implementatie dus ik ga er maar vanuit dat deze goed werkt en ik iets niet goed doe ... Wat doe ik fout?

Gebruikt iemand dit script om passwords te vergelijken met de passwd file?

Niet quoten, zorgvuldige reacties volgens de regels worden zo weggewerkt: *knip*, reactie op geknipte reactie.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:39

crisp

Devver

Pixelated

code:
1
$1$caGSSkwB$HFfuR.YJWJLu8EA7B6bOI.

Da's sowieso geen base64 encoding ;) Ik denk dat er binhex gebruikt wordt als encoding

[ Voor 23% gewijzigd door crisp op 16-06-2006 22:41 ]

Intentionally left blank


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:39

crisp

Devver

Pixelated

ok, ik heb even crypt_md5 geport naar javascript; hierbij is nog wel steeds de md5.js benodigd die je al had:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
function crypt_md5(plain, salt)
{
    salt = salt.substr(0, 8);
    var length = plain.length;
    var context = plain + '$1$' + salt;
    var binary = str_md5(plain + salt + plain);

    for (var i = length; i > 0; i -= 16)
    {
        context += binary.substr(0, (i > 16 ? 16 : i));
    }
    for (i = length; i > 0; i = i >> 1)
    {
        context += (i & 1) ? String.fromCharCode(0) : plain.charAt(0);
    }

    binary = str_md5(context);

    var newbin;
    for (i = 0; i < 1000; i++)
    {
        newbin = (i & 1) ? plain : binary.substr(0, 16);
        if (i % 3)
            newbin += salt;
        if (i % 7)
            newbin += plain;

        newbin += (i & 1) ? binary.substr(0, 16) : plain;
        binary = str_md5(newbin);
    }

    var p = [];
    var k, j;
    for (i = 0; i < 5; i++)
    {
        k = i + 6;
        j = i + 12;
        if (j == 16)
            j = 5;

        p[p.length] = to64(
            (binary.charCodeAt(i) << 16) |
            (binary.charCodeAt(k) << 8) |
            (binary.charCodeAt(j)),
            5
        );
    }

    return '$1$' + salt + '$' + p.join('') + to64(binary.charCodeAt(11), 3);
}

function to64(value, count)
{
    var _FILE_PASSWD_64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    var result = '';

    while (--count)
    {
        result += _FILE_PASSWD_64.charAt(value & 0x3f);
        value >>= 6;
    }

    return result;
}

var password = 'Holten';
var salt = 'caGSSkwB';

document.write(crypt_md5(password, salt));

mind you: dit is traag :P (dat komt vnl omdat de md5 implementatie van Paj traag is, maar om die zelf te gaan herschrijven vond ik iets teveel werk).

[ Voor 17% gewijzigd door crisp op 17-06-2006 00:38 ]

Intentionally left blank


  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:29

hamsteg

Species 5618

Topicstarter
Whow ! Moet nu weg, het is Papa-dag, maar ik duik hier later wel in ... zo heel snel zag ik niet wat je allemaal gedaan hebt maar daar kom ik nog wel uit en zo niet dan vind je me hier wel weer terug ;)

In iedergeval voorlopig: Bedankt !

Niet quoten, zorgvuldige reacties volgens de regels worden zo weggewerkt: *knip*, reactie op geknipte reactie.


  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

nooit...maar dan ook noooooooooit je /etc/shadow file voor zoiets gebruiken :o

Maak gewoon lekker een tabel in je database hiervoor aan en haal daar je gegevens uit, zodat je code i.i.g. niet als root hoeft te draaien en je ook 100% zeker niet aan je root password kunt komen.

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Ik dacht ooit opgevangen te hebben dat je PAM vanuit PHP kan aanspreken. Dat lijkt me een betere oplossing ;)

(ik neem aan dat je nu php gebruikt om bij je shadowfile te komen)

[ Voor 25% gewijzigd door Infinitive op 18-06-2006 14:44 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 03:31

Gerco

Professional Newbie

@Infinitive: Ja, dat kan inderdaad. Helaas is pam een library (een hele set eigenlijk) en geen daemon. Daarom moet de user die PAM draait (apache/nobody) nog steeds leesrechten hebben op /etc/shadow.

Ik wilde ook php/pam gebruiken, maar als je gebruik maakt van /etc/shadow is dat een slecht idee. Je zou wel php-pam en pam-ldap oid kunnen gebruiken, dat is veiliger, want dan hoef je /etc/shadow niet te kunnen lezen.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
moto-moi schreef op zondag 18 juni 2006 @ 14:31:
nooit...maar dan ook noooooooooit je /etc/shadow file voor zoiets gebruiken :o

Maak gewoon lekker een tabel in je database hiervoor aan en haal daar je gegevens uit, zodat je code i.i.g. niet als root hoeft te draaien en je ook 100% zeker niet aan je root password kunt komen.
Of gebruik een gestandaardiseerde methode als PAM. Dit is al redelijk uitgekristaliseerd en hiermee krijg je weinig beveiligingproblemen.

Rechtstreekse toegang tot /etc/shadow betekent ook dat als er 1 fout inzit dat mensen rechtstreeks je root-wachtwoord kunnen hebben.

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Gerco schreef op zondag 18 juni 2006 @ 14:54:
@Infinitive: Ja, dat kan inderdaad. Helaas is pam een library (een hele set eigenlijk) en geen daemon. Daarom moet de user die PAM draait (apache/nobody) nog steeds leesrechten hebben op /etc/shadow.
Ik moet toegeven dat ik PAM ook nog niet gebruikt heb. Ik moest een aantal geleden iets dergelijks hebben, maar dat heb ik toen opgelost door vanuit m'n php script een POP3 connectie te maken en zo gebruikersnaam en wachtwoord te controleren. Op zich voldeed het prima in mijn geval, maar mooi is anders :)

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:29

hamsteg

Species 5618

Topicstarter
Het is niet helemaal de /etc/shadow file maar een afgeleide die alleen gebruikers bevat die geen login account hebben (in /etc/passwd GID >= 5000). Deze gegenereerde file is owner php user. Eens in de zoveel tijd draait er een batch die deze file genereert uit de /etc/shadow file en de /etc/password file.

Ik begin af te zien van verschillende databases die even dit of even dat bevatten. Kost enorm veel tijd in onderhoud. Ik kan daarnaast een klant niet uitleggen waarom hij/zij drie vier verschillende passwoorden moet gebruiken ...(ja, ja wij gotters zijn panisch als het gaat om beveiliging maar leg dat je oma of de slager om de hoek maar eens uit?). Ik genereer een passwoord (die voldoet aan behoorlijke eisen) maar wil de gebruiker alleen dit passwoord geven en niet nog drie anderen. Alles bewust vanuit een plek (maar alleen voor gebruikers die geen systeem rechten hebben).

Ik ben tegenstander van plugins omdat je niet weet wat je in huis haalt en ook door het vele gebruik van plugins de security wordt aangetast. Heb hier een vervelende ervaring mee gehad en wil dat niet weer mee maken. Plain en basic heeft mijn voorkeur. Misschien nog wel handig om even een binary te schrijven die de controle meer buiten PHP script haalt ... maar een echte thread zie ik hier niet in.

Niet quoten, zorgvuldige reacties volgens de regels worden zo weggewerkt: *knip*, reactie op geknipte reactie.


  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:29

hamsteg

Species 5618

Topicstarter
He, he,

Eindelijk getest ... en het werkt fantastisch. Ik post nu een gecrypt password. Ik heb aan de server kant nog een paar probleempjes maar overall ziet het er goed uit.

Thanks Crisp ! _/-\o_

Niet quoten, zorgvuldige reacties volgens de regels worden zo weggewerkt: *knip*, reactie op geknipte reactie.

Pagina: 1