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

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:

einfach die funktion von php verwenden…

Nils aka XraYSoLo

könntest du das bitte bissl genauer erklären?

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

Mfg

und wie konkret muss ich das verwenden?
was ist / macht das salz überhaupt?

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

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

ja, nur meine frage war: wofür konkret würd die funktion salz() gebraucht?
was macht das?
wie würde denn eine abfrage aussehen?

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

function meinSalz($username) { $username = substr(md5($username.time()),4 ,16); } 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?

meinSalz($username, $password, $email);  

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??

das salz erzeugt einen wert, der dann per SQL-abfrage eingetragen wird.

Quakenet/#php Tutorial - de - Einleitung

Nils aka XraYSoLo

Also das Salz ist erstmal für die Spalte „user_form_salt“.

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

OK -.-
jetz check ich garnix mehr…

könntest du mir mal den codeschnipsel schicken?? :oops:

den hast du doch oben von der zahl schon bekommen…

Nils aka XraYSoLo

Hi,
möchte das Thema nochmal ausgraben :slight_smile:

Ich bin im Internet auf folgenden Code gestoßen

[PHP]<?php

Portable PHP password hashing framework.

Version 0.2 / genuine.

Written by Solar Designer 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;
}

}

?>
[/PHP]

ich habe nur keine ahnung wie das mit der klasse funktioniert…
nachdem ich
[PHP]$PasswordHash = new PasswordHash;[/PHP]
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 :slight_smile: