• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

phpbb3 User Tabelle auch für Website Login nutzen...

Luk.Online

Neues Mitglied
Hallo zusammen.
Wie der Titel schon sagt, würde ich gern die Tabelle phpbb_users auch für die Anmeldung auf meiner Website verwenden.

die registrierung soll komplett über das board laufen, jedoch will ich in der tabelle phpbb_users eine spalte erweitern. "website" oder ähnlich.
es soll ja nicht jeder, der im forum registriert ist, in meinen memberbereich. das kann ich in der spalte "website" ja mit 1 und 0 kontrollieren und mit php darauf reagieren: wenn 1, ist der zugriff gestattet, wenn 0, eben nich.

es geht also wirklich nur um ein Login-Form, aber ich muss ja irgendwie das eingegebene Passwort mit dem gehashten in der phpbDB vergleichen.

Und da kommt das Problem. Phpbb3 verwendet ja nicht nur md5() sondern auch eine eigene funktion phpbb_hash()...(salt nennt sich das laut google) nur weiß ich jetz echt nicht, wie ich das passwort aus dem form mit md5() und dem phpbb_hash() verschlüssele. wenn ich das habe, kann ich es ja einfach mit dem in der db vergleichen.

Also nochmal kurz:
Wie kann ich den Wert aus einem <input type="password" ....> mit md5() und phpbb_hash() verschlüseln? Kann mir jemand helfen?

Wäre sehr nett!

Danke schonmal, Luk. :razz:
 
Ich selber verwende es auch. Und den Salz definiere ich mit:
PHP:
   function meinSalz($username) { 
   $username = substr(md5($username.time()),4 ,16);
   }
Und dann die Tabelle user_form_salt bestücken mit:
PHP:
meinSalz($username, $password, $email);
Funktioniert bei mir wunderbar mit phpbb3.x

Mfg
 
salz (NaCL, natriumchlorid, "speisesalz") sorgt im allgemeinen für eine subionisierung verbindungsähnlicher atome ("gitterstruktur" im kalottenmodell).

die zahl hat oben doch alles zur verwendung hingeschrieben. wäre wohl besser, wenn du dir die grundlegenden routinen von PHP mal ansehen würdest.
die funktion heißt nur salz, könnte auch pfeffer() oder keinen_richtigen_funktionsnamen_gefunden() heißen.

Nils aka XraYSoLo
 
und wie konkret muss ich das verwenden?
was ist / macht das salz überhaupt?
Salz... weil du mit dem Wort Salt angefangen hast:
Phpbb3 verwendet ja nicht nur md5() sondern auch eine eigene funktion phpbb_hash()...(salt nennt sich das laut google) nur weiß ich jetz echt nicht, wie ich das passwort aus dem form mit md5() und dem phpbb_hash() verschlüssele.
"user_form_salt" = meinSalz($username, $password, $email); , das war meine Antwort darauf.

Mfg
 
das steht doch alles oben...du hast dir dafür doch die erklärung schon selber gegeben.

wie du einen login machst, hab' ich hier im tutorial-bereich mal gepostet.

Nils aka XraYSoLo
 
ja,was bei der verschlüsselung passiert weiß ich schon.
einen login bereich hab ich auch schon, nur mit einer anderen DB, die das Passwort nur mit md5() verschlüsselt. da liegt also nicht das problem

mit der funktion
Code:
[COLOR=#000000][COLOR=#007700]function [/COLOR][COLOR=#0000bb]meinSalz[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]$username[/COLOR][COLOR=#007700]) { 
   [/COLOR][COLOR=#0000bb]$username [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]substr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]md5[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]$username[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]time[/COLOR][COLOR=#007700]()),[/COLOR][COLOR=#0000bb]4 [/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]16[/COLOR][COLOR=#007700]);
   }  [/COLOR][/COLOR]
erstelle ich ja nur den salt hash, der in der db in user_form_salt gespeichert wird. aber wie komm ich von ihm auf das Passwort?

man muss ja eigentlich nur das pw verschlüsseln? oder ist es auch ratsam username und email zu verschlüsseln?

Code:
[COLOR=#000000][COLOR=#0000BB]meinSalz[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]$username[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]$password[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]$email[/COLOR][COLOR=#007700]);  [/COLOR][/COLOR]
 
passwort reicht. entschlüsseln kannst du md5 sowieso nicht mehr.
der schnippsel von dir ist lediglich dafür, um zufallswerte aus usernamen und mail zu erzeugen.

Nils aka XraYSoLo
 
das mit dem funktionen ist ja schön und gu, aber sorry - ich versteh nicht, wie kann ich aus

"Passwort" mithilfe des salts oder mit was auch immer auf den wert in der tabellenspalte user_passwd kommen??
 
Also das Salz ist erstmal für die Spalte "user_form_salt".
das mit dem funktionen ist ja schön und gu, aber sorry - ich versteh nicht, wie kann ich aus

"Passwort" mithilfe des salts oder mit was auch immer auf den wert in der tabellenspalte user_passwd kommen??

mit md5(); ? Ich vergleiche md5($passwort); mit dem Passwort aus der phpbb3 Tabelle vom Benutzer, so wie man es normalerweise auch macht.

Mfg
 
zum grundverständnis:

- das bei der registrierung eingegebene passwort wird mit md5 verschlüsselt und gespeichert
- das beim login angegebene passwort wird mit md5 verschlüsselt mit dem datenbankwert verglichen
- das md5-gecryptete passwort kann nicht decryptet (entschlüsselt) werden
- die md5-verschlüsselung trägt nur zur sicherheit INNERHALB der datenbank bei
- zusendung des passworts per mail bei verlust ist somit nicht möglich
- der support muss ein neues passwort vergeben
- salz macht erzeugt kombinationen aus mail und usernamen, um das passwort sicherer zu machen
- username und mail müssen nicht verschlüsselt werden.

Nils aka XraYSoLo
 
achso...
ich dachte der md5 hash wird nochmal mit salt verschlüsselt.

OK, da habe ich es grundlegend falsch verstanden.

aber nochmal: mein passwort in der datenbank ist != md5($_POST["Passwort"])

woran liegt das?
 
liegt daran, dass das passwort aus einer kombination aus md5 und usernamen generiert wird (das macht salz).

Nils aka XraYSoLo
 
Hi,
möchte das Thema nochmal ausgraben :)

Ich bin im Internet auf folgenden Code gestoßen

PHP:
<?php
#
# Portable PHP password hashing framework.
#
# Version 0.2 / genuine.
#
# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
# the public domain.
#
# There's absolutely no warranty.
#
# The homepage URL for this framework is:
#
#    http://www.openwall.com/phpass/
#
# Please be sure to update the Version line if you edit this file in any way.
# It is suggested that you leave the main version number intact, but indicate
# your project name (after the slash) and add your own revision information.
#
# Please do not change the "private" password hashing method implemented in
# here, thereby making your hashes incompatible.  However, if you must, please
# change the hash type identifier (the "$P$") to something different.
#
# Obviously, since this code is in the public domain, the above are not
# requirements (there can be none), but merely suggestions.
#
class PasswordHash {
    var $itoa64;
    var $iteration_count_log2;
    var $portable_hashes;
    var $random_state;

    function PasswordHash($iteration_count_log2, $portable_hashes)
    {
        $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

        if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
            $iteration_count_log2 = 8;
        $this->iteration_count_log2 = $iteration_count_log2;

        $this->portable_hashes = $portable_hashes;

        $this->random_state = microtime() . getmypid();
    }

    function get_random_bytes($count)
    {
        $output = '';
        if (is_readable('/dev/urandom') &&
            ($fh = @fopen('/dev/urandom', 'rb'))) {
            $output = fread($fh, $count);
            fclose($fh);
        }

        if (strlen($output) < $count) {
            $output = '';
            for ($i = 0; $i < $count; $i += 16) {
                $this->random_state =
                    md5(microtime() . $this->random_state);
                $output .=
                    pack('H*', md5($this->random_state));
            }
            $output = substr($output, 0, $count);
        }

        return $output;
    }

    function encode64($input, $count)
    {
        $output = '';
        $i = 0;
        do {
            $value = ord($input[$i++]);
            $output .= $this->itoa64[$value & 0x3f];
            if ($i < $count)
                $value |= ord($input[$i]) << 8;
            $output .= $this->itoa64[($value >> 6) & 0x3f];
            if ($i++ >= $count)
                break;
            if ($i < $count)
                $value |= ord($input[$i]) << 16;
            $output .= $this->itoa64[($value >> 12) & 0x3f];
            if ($i++ >= $count)
                break;
            $output .= $this->itoa64[($value >> 18) & 0x3f];
        } while ($i < $count);

        return $output;
    }

    function gensalt_private($input)
    {
        $output = '$P$';
        $output .= $this->itoa64[min($this->iteration_count_log2 +
            ((PHP_VERSION >= '5') ? 5 : 3), 30)];
        $output .= $this->encode64($input, 6);

        return $output;
    }

    function crypt_private($password, $setting)
    {
        $output = '*0';
        if (substr($setting, 0, 2) == $output)
            $output = '*1';

        if (substr($setting, 0, 3) != '$P$')
            return $output;

        $count_log2 = strpos($this->itoa64, $setting[3]);
        if ($count_log2 < 7 || $count_log2 > 30)
            return $output;

        $count = 1 << $count_log2;

        $salt = substr($setting, 4, 8);
        if (strlen($salt) != 8)
            return $output;

        # We're kind of forced to use MD5 here since it's the only
        # cryptographic primitive available in all versions of PHP
        # currently in use.  To implement our own low-level crypto
        # in PHP would result in much worse performance and
        # consequently in lower iteration counts and hashes that are
        # quicker to crack (by non-PHP code).
        if (PHP_VERSION >= '5') {
            $hash = md5($salt . $password, TRUE);
            do {
                $hash = md5($hash . $password, TRUE);
            } while (--$count);
        } else {
            $hash = pack('H*', md5($salt . $password));
            do {
                $hash = pack('H*', md5($hash . $password));
            } while (--$count);
        }

        $output = substr($setting, 0, 12);
        $output .= $this->encode64($hash, 16);

        return $output;
    }

    function gensalt_extended($input)
    {
        $count_log2 = min($this->iteration_count_log2 + 8, 24);
        # This should be odd to not reveal weak DES keys, and the
        # maximum valid value is (2**24 - 1) which is odd anyway.
        $count = (1 << $count_log2) - 1;

        $output = '_';
        $output .= $this->itoa64[$count & 0x3f];
        $output .= $this->itoa64[($count >> 6) & 0x3f];
        $output .= $this->itoa64[($count >> 12) & 0x3f];
        $output .= $this->itoa64[($count >> 18) & 0x3f];

        $output .= $this->encode64($input, 3);

        return $output;
    }

    function gensalt_blowfish($input)
    {
        # This one needs to use a different order of characters and a
        # different encoding scheme from the one in encode64() above.
        # We care because the last character in our encoded string will
        # only represent 2 bits.  While two known implementations of
        # bcrypt will happily accept and correct a salt string which
        # has the 4 unused bits set to non-zero, we do not want to take
        # chances and we also do not want to waste an additional byte
        # of entropy.
        $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

        $output = '$2a$';
        $output .= chr(ord('0') + $this->iteration_count_log2 / 10);
        $output .= chr(ord('0') + $this->iteration_count_log2 % 10);
        $output .= '$';

        $i = 0;
        do {
            $c1 = ord($input[$i++]);
            $output .= $itoa64[$c1 >> 2];
            $c1 = ($c1 & 0x03) << 4;
            if ($i >= 16) {
                $output .= $itoa64[$c1];
                break;
            }

            $c2 = ord($input[$i++]);
            $c1 |= $c2 >> 4;
            $output .= $itoa64[$c1];
            $c1 = ($c2 & 0x0f) << 2;

            $c2 = ord($input[$i++]);
            $c1 |= $c2 >> 6;
            $output .= $itoa64[$c1];
            $output .= $itoa64[$c2 & 0x3f];
        } while (1);

        return $output;
    }

    function HashPassword($password)
    {
        $random = '';

        if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {
            $random = $this->get_random_bytes(16);
            $hash =
                crypt($password, $this->gensalt_blowfish($random));
            if (strlen($hash) == 60)
                return $hash;
        }

        if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {
            if (strlen($random) < 3)
                $random = $this->get_random_bytes(3);
            $hash =
                crypt($password, $this->gensalt_extended($random));
            if (strlen($hash) == 20)
                return $hash;
        }

        if (strlen($random) < 6)
            $random = $this->get_random_bytes(6);
        $hash =
            $this->crypt_private($password,
            $this->gensalt_private($random));
        if (strlen($hash) == 34)
            return $hash;

        # Returning '*' on error is safe here, but would _not_ be safe
        # in a crypt(3)-like function used _both_ for generating new
        # hashes and for validating passwords against existing hashes.
        return '*';
    }

    function CheckPassword($password, $stored_hash)
    {
        $hash = $this->crypt_private($password, $stored_hash);
        if ($hash[0] == '*')
            $hash = crypt($password, $stored_hash);

        return $hash == $stored_hash;
    }
}

?>

ich habe nur keine ahnung wie das mit der klasse funktioniert...
nachdem ich
PHP:
$PasswordHash = new PasswordHash;
kann ich auf die funktion PasswordHash() zugreifen.

aber versteht jemand was mit den variablen $iteration_count_log2 und $portable_hashes passiert?
was muss ich da übergeben?


Danke schonmal :)
 
Zurück
Oben