Passwort Verschlüsselung bei Regi + Login !?

09/22/2011 20:45 NoWe53#1
Hey elitepvpers,

ich habe folgendes Regi script gemach:

register.php

PHP Code:
<?php

// Check if he wants to register:
if (!empty($_POST[email]))
{
    
// Check if passwords match.
    
if ($_POST[password] != $_POST[password2])
        exit(
"Error - Passwärter stimmen nicht überrein. Bitte versuche es noch einmal.");

    
// Assign some variables.
    
$ip $_SERVER[REMOTE_ADDR];
    
$password md5($_POST['password']);  

    require_once(
"connect.php");

    
// Register him.
     
$query mysql_query("INSERT INTO user 
    (email, displayName, name, password, bday)
    VALUES    ('
$_POST[email]','$_POST[displayName]','$_POST[name]','$password','$bday')")
    or die (
"Error - Registrieren fehlgeschlagen.");  

$query mysql_query("SELECT * FROM 'user' WHERE email = '$email'");
if (
mysql_fetch_row($query)) {
echo 
"Bitte andere Username";
} else
    
    echo 
"Welcome $_POST[username]! You've been successfully reigstered!<br /><br />
        Please login <a href='login.php'><b>here</b></a>."
;
    exit();
}

?>

<html>
    <head>
        <title>Registrieren</title>
    </head>
    <body>
        <form action="register.php" method="post">
            <table width="75%" border="1" align="center" cellpadding="3" cellspacing="1">
                <tr>
                    <td width="100%"><h5>Registration</h5></td>
                </tr>
                <tr>
                    <td width="100%"><label>Email: <input type="text" name="email" size="25" value="<? echo $_POST[email]; ?>"></label></td>
                </tr>
                <tr>
                    <td width="100%"><label>Anzeige-Name: <input type="text" name="displayName" size="25" value="<? echo $_POST[displayName]; ?>"></label></td>
                </tr>
                <tr>
                    <td width="100%"><label>Name: <input type="text" name="name" size="25" value="<? echo $_POST[name]; ?>"></label></td>
                </tr>
                <tr>
                    <td width="100%"><label>Passwort: <input type="password" name="password" size="16" value="<? $password md5($_POST['password']); ?>"></label></td>
                </tr>
                <tr>
                    <td width="100%"><label>Passwort wiederholen: <input type="password" name="password2" size="16" value=""></label></td>
                </tr>
                <tr>
                    <td width="100%"><input type="submit" value="Registrieren!"></td>
                </tr>
            </table>
        </form>
    </body>
</html>


Die Login.tpl sieht so aus:

PHP Code:
<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Language" content="en" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>{$_title}</title>
    <link rel="stylesheet" type="text/css" href="{$_tpl}css/tpl_login.css" />
</head>
<body>
<div id="pg_center">
<div id="pg_pageframe">
    <form action="index.php" method="post">
        <input type="hidden" name="trytologin" value="true" />
        <div id="header">Mein Projekt</div>
        <div id="loginTitle">{lng k='login'}</div><br/>
        <div id="login_area">
            {if $error eq 'true'}
            <center><i>{lng k='login_failed'}</i></center>
            {/if}
            <table cellpadding="2" cellspacing="0" border="0">
                <tr>
                    <td style="width: 100px;"><label for="f1">{lng k='email'}:</label></td>
                    <td><input type="text" id="f1" name="email" style="width: 251px;" /></td>
                </tr>
                <tr>
                    <td><label for="f2">{lng k='password'}:</label></td>
                    <td><input type="password" id="f2" name="pass" style="width: 251px;" /></td>
                </tr>
                <tr><td></td><td>
                    <input type="checkbox" name="saveLogin" id="f3" value="true" /> <label for="f3">{lng k='login_remember'}</label>
                </td></tr>
                <tr><td></td><td style="text-align: left;">
                    <input type="submit" style="font-size: 10px;" value="{lng k='submit'}" /> <input type="reset" style="font-size: 10px;" value="{lng k='reset'}" />
                </td></tr>
            </table>
            <div id="rights">{$_copy}</div>
        </div>
    </form>
</div>
</div>
</body>
</html>
Mein Admin-Register sieht so aus:

PHP Code:
if($_GET['action'] == 'create') {
    if(isset(
$_GET['save']) && $_GET['save']!="") {
        
$db _new("db");
        
$pw substr(rand(),-4);
        
$f = array("displayName","name","password","email","notify");
        
$v = array($_POST['name'],$_POST['name'],md5($pw.PASSWORDUNIQUESTRING),$_POST['email'],62);
        
$db->insert("user",$f,$v);
        
$s _new("session");
        
$s->changedUser();

        
$parser->assign("title",lang("creausertitle","mod"));
        
$parser->assign("text",lang("creausertext","mod").$pw);
        
$parser->setContent("ls/success.tpl");
    } else 
$parser->setContent("ls/ucreate.tpl");

Nun ist mein Problem, dass wenn ich mich Registriere, wird das passwort per MD5 auf meiner Datenbank gespeichert (Login unmöglich). Wenn ich mich allerdings mit dem Admin-Script installiere, habe ich einen anderen Hash (Login möglich), ich möchte, dass man sich mit der register.php auch so installieren kann, dass der Login möglich ist.

MfG nicileie

Edit #1:

auf der Index.php wird die Datei init.php included...

In der finde ich zum Login nur folgendes:

PHP Code:
$_prefs['user'] = _new("user"); $login_return false;
if(isset(
$_POST['trytologin']) && $_POST['trytologin'] == 'true') {
    if(
$_POST['email'] == ""$_POST['email'] = "wrong";
    if(
$_POST['pass'] == ""$_POST['pass'] = "wrong";
    if(isset(
$_POST['saveLogin']) && $_POST['saveLogin'] == 'true') {
        
$login_return $_prefs['user']->login($_POST['email'],$_POST['pass'], true);
    } else {
        
$login_return $_prefs['user']->login($_POST['email'],$_POST['pass']);
    }
    
define("LOGINSITE"TRUE);
} else {
    
$_prefs['user']->login();
}
if(
$_prefs['user']->logged()) { define("UID",$_prefs['user']->logged()); }
else {
    
define("UID",false);
    if(!
defined("LOGINSITE")) define("LOGINSITE"TRUE);
}
if(!
NOLASTACTREFRESH && UID) {
    
$db _new("db");
    
$db->update("user",array("lastAct"), array(time()), "WHERE `ID` = '".UID."'");

und

PHP Code:
if(!defined("LOGINSITE")) define("LOGINSITE"false);
if(!
PICFASTRENDER) {
    if(
LOGINSITE && ($login_return == LOGIN_SUCCESS || $login_return == LOGIN_CKSUCCESS)) {
        
$parser _new("parser");
        if(
$login_return == LOGIN_SUCCESS) {
            
$parser->assign("cookie","false");
        } else {
            
$parser->assign("cookie","true");
        }
        
$parser->display("sites/login_success.tpl");
        exit();
    } elseif(
LOGINSITE && $login_return == LOGIN_FAILED) {
        
$parser _new("parser");
        
$parser->assign("error"true);
        
$parser->display("sites/login.tpl");
        exit();
    } elseif(
LOGINSITE && $login_return === FALSE) {
        
$parser _new("parser");
        
$parser->assign("error"false);
        
$parser->display("sites/login.tpl");
        exit();
    }
} else {
    if(
LOGINSITE) {
        echo 
"error no permission";
    }

#Edit2:

Habe iregndwo gelesen, dass das in index.php gepostet wird.

Hier meine Index.php:

PHP Code:
include("./lib/init.php");
$parser _new("parser");

if(!(isset(
$_GET['action']) && $_GET['action'] != "")) {
    
$_GET['action'] = "index";
}

if(
$_GET['action'] == 'index') {
    
$parser->assign("delresult","0");
    
$parser->setNav(lang("changelogArchive"),  "index.php?action=archive");
    
$parser->setNav(lang("chatArchive"),  "index.php?action=chatarchive");
    
$parser->setNav(lang("myProfil"),  "profile.php?uid=".UID);
    
$parser->setNav(lang("myAcc","nav"),  "myAccount.php");
    
$parser->setContent("ls/index.tpl");
    
$parser->display("index.tpl");
}

if(
$_GET['action'] == 'rss') {
    
$rss _new("rss",lang("title","rss"),HTTP_ROOT,lang("desc","rss"));
    
$db _new("db");
    
$db->saveQry("SELECT * FROM `#_changelog` WHERE `visible` = '0' OR `visible` = ? ORDER BY `time` DESC LIMIT 0,".eppRssUID);
    while(
$row $db->fetch_assoc()) {
        
$txt lang($row['key'], 'rss');
        if(
$txt != '') {
            
$txt lang($row['key'], 'rss');
            
$search =array("%BY%","%NAME%","%REL%","%VAL%");
            
$replace = array($row['by'],userInfo($row['by'],"displayName"),$row['related'],$row['value']);
            
$row['value'] = str_replace($search,$replace,$txt);
        }
        
$title =$row['value'];$link =HTTP_ROOT;
        switch(
$row['key']) {
            case 
CLOG_LINK$title =lang("link").": ".http(urldecode($row['value'])); $link=http(urldecode($row['value']));break;
            case 
CLOG_PM:  $link=HTTP_ROOT."pm.php?action=read&id=".$row['related'];break;
            case 
CLOG_GALLERY$link=HTTP_ROOT."gallery.php?action=view&gid=".$row['related'];break;
            case 
CLOG_THREAD$link HTTP_ROOT."board.php?action=thread&tid=".$row['related']."#last";break;
            case 
CLOG_POST$link HTTP_ROOT."board.php?action=thread&tid=".$row['related']."#last";break;
            case 
CLOG_PROFILE$link HTTP_ROOT."profile.php?uid=".$row['by']."&show=profs";break;
            case 
CLOG_QUOTE$link HTTP_ROOT."quotes.php";break;
        }
        
$rss->addItem(html($title),html($link),$row['time']);
    }
    
$rss->output();
}

if(
$_GET['action'] == 'archive') {
    
$page 1$epp eppClogArchiv;
    if(isset(
$_GET['page'])) {
        
$page = (int)$_GET['page'];
    }
    
$start = ($epp $page)-$epp;


    
$cl _new("changelog");
    
$res $cl->read($epp,$start);

    
$db _new("db");
    
$db->saveQry("SELECT COUNT(*) as `datasets` FROM `#_changelog` WHERE `visible` = '0' OR `visible` = ?",UID);
    
$count $db->fetch_assoc(); $db->free();

    
$parser->assign("p_act"$page);
    
$parser->assign("p_epp"$epp);
    
$parser->assign("p_url","./index.php?action=archive");
    
$parser->assign("p_cou"$count['datasets']);

    
$parser->assign("log"$res);
    
$parser->setNav(lang("changelogArchive"),  "index.php?action=archive");
    
$parser->setNav(lang("chatArchive"),  "index.php?action=chatarchive");
    
$parser->setNav(lang("myProfil"),  "profile.php?uid=".UID);
    
$parser->setNav(lang("myAcc","nav"),  "myAccount.php");
    
$parser->setContent("ls/index.clog.tpl");
    
$parser->display("index.tpl");
}

if(
$_GET['action'] == 'changeTemplate') {
    
$sess _new("session");
        if(
$_GET['tpl'] != "")
        
$sess->changeTemplate($_GET['tpl']);
        else
        
$sess->changeTemplate();
    
$parser->display("sites/template.tpl");
}

if(
$_GET['action'] == 'chatarchive') {
    
$page 1$epp eppSboxArchiv;
    if(isset(
$_GET['page'])) {
        
$page = (int)$_GET['page'];
    }
    
$start = ($epp $page)-$epp;

    
$db _new("db");
    
$db->saveQry("SELECT * FROM `#_sbox` ORDER BY `ID` DESC LIMIT ".$start.",".$epp);
    while(
$row $db->fetch_assoc()) {
        
$res[] = $row;
    }

    
$db->saveQry("SELECT COUNT(*) as `datasets` FROM `#_sbox`");
    
$count $db->fetch_assoc(); $db->free();

    
$parser->assign("p_act"$page);
    
$parser->assign("p_epp"$epp);
    
$parser->assign("p_url","./index.php?action=chatarchive");
    
$parser->assign("p_cou"$count['datasets']);

    
$parser->assign("res"$res);
    
$parser->setNav(lang("changelogArchive"),  "index.php?action=archive");
    
$parser->setNav(lang("chatArchive"),  "index.php?action=chatarchive");
    
$parser->setNav(lang("myProfil"),  "profile.php?uid=".UID);
    
$parser->setNav(lang("myAcc","nav"),  "myAccount.php");
    
$parser->setContent("ls/index.chat.tpl");
    
$parser->display("index.tpl");
}

if(
$_GET['action'] == 'changeLang') {
    
$sess _new("session");
        if(
$_GET['lang'] != "")
        
$sess->changeLang($_GET['lang']);
        else
        
$sess->changeLang();
    
$parser->display("sites/lang.tpl");
}
?> 
09/22/2011 21:07 Menan#2
Poste mal noch die login PHP Datei.
09/22/2011 21:26 NoWe53#3
#added
09/22/2011 21:30 Menan#4
In beiden findet sich kein query zur überprüfung... Eventuell ist noch eine Datei darin verankert ?
09/22/2011 21:45 NoWe53#5
#Edit 2
#added

#Edit1:

Hast du vielleicht Teamviewer? - und könntest mir damit helfen, finde nix mehr :(

#Edit2:

Was gibt es noch für Verschlüsselungsarten, die 32 Zeichen lang sind?
09/22/2011 23:16 Guarania#6
Sha1, oder irre ich mich ? oder meinste jetzt Verschlüsselungen... Hashs (wie es ja md5 einer ist) sind nochmal etwas ganz anderes ^^
09/22/2011 23:21 ms​#7
Quote:
Originally Posted by nicileie View Post

PHP Code:
$password md5($_POST['password']); 
PHP Code:
md5($pw.PASSWORDUNIQUESTRING
Das ist der Unterschied. Das zweite Script schreibt einen Salt (PASSWORDUNIQUESTRING) hinter dein Passwort und hasht es dann. Dein selbstgemachtes Script macht das nicht.
09/23/2011 13:28 NoWe53#8
Quote:
Originally Posted by Metin2Spieler97 View Post
Das ist der Unterschied. Das zweite Script schreibt einen Salt (PASSWORDUNIQUESTRING) hinter dein Passwort und hasht es dann. Dein selbstgemachtes Script macht das nicht.
Schonmal danke, aber wie mache ich, das es den Salt beim Registrieren ebenfalls dahintershreibt und es dann hasht?

MfG nicileie
09/23/2011 13:51 Snake124#9
PHP Code:
$password md5($_POST['password'].$SALT); 
den salt musst du dir halt vorher irgendwie organisieren, sei es durch berechnen oder auslesen aus der datenbank
09/23/2011 13:54 NoWe53#10
d.h. ich muss das so oder ähnlich einfügen:

PHP Code:
$salt "PASSWORDUNIQUESTRING";
$password md5($_POST['password'].$SALT); 
meine Register.php sieht jetzt feolgendermasen aus:

PHP Code:
<?php

// Check if he wants to register:
if (!empty($_POST[email]))
{
    
// Check if passwords match.
    
if ($_POST[password] != $_POST[password2])
        exit(
"Error - Passwärter stimmen nicht überrein. Bitte versuche es noch einmal.");

    
// Assign some variables.
    
$ip $_SERVER[REMOTE_ADDR];
    
$password md5($_POST['password'].$SALT);
    
$salt "PASSWORDUNIQUESTRING";  

    require_once(
"connect.php");

    
// Register him.
     
$query mysql_query("INSERT INTO user 
    (email, displayName, name, password, bday)
    VALUES    ('
$_POST[email]','$_POST[displayName]','$_POST[name]','$password','$bday')")
    or die (
"Error - Registrieren fehlgeschlagen.");  

$query mysql_query("SELECT * FROM 'user' WHERE email = '$email'");
if (
mysql_fetch_row($query)) {
echo 
"Bitte andere Username";
} else
    
    echo 
"Welcome $_POST[username]! You've been successfully reigstered!<br /><br />
        Please login <a href='login.php'><b>here</b></a>."
;
    exit();
}

?>

<html>
    <head>
        <title>Registrieren</title>
    </head>
    <body>
        <form action="register.php" method="post">
            <table width="75%" border="1" align="center" cellpadding="3" cellspacing="1">
                <tr>
                    <td width="100%"><h5>Registration</h5></td>
                </tr>
                <tr>
                    <td width="100%"><label>Email: <input type="text" name="email" size="25" value="<? echo $_POST[email]; ?>"></label></td>
                </tr>
                <tr>
                    <td width="100%"><label>Anzeige-Name: <input type="text" name="displayName" size="25" value="<? echo $_POST[displayName]; ?>"></label></td>
                </tr>
                <tr>
                    <td width="100%"><label>Name: <input type="text" name="name" size="25" value="<? echo $_POST[name]; ?>"></label></td>
                </tr>
                <tr>
                    <td width="100%"><label>Passwort: <input type="password" name="password" size="16" value="<? $password md5($_POST['password']); ?>"></label></td>
                </tr>
                <tr>
                    <td width="100%"><label>Passwort wiederholen: <input type="password" name="password2" size="16" value=""></label></td>
                </tr>
                <tr>
                    <td width="100%"><input type="submit" value="Registrieren!"></td>
                </tr>
            </table>
        </form>
    </body>
</html>
Edit #1:

Das Registrieren funktioniert, dass einloggen immernoch nicht...
09/23/2011 14:03 Che#11
den Salt must du in einem extra feld in der datenbank speichern....

wenn du dich einloggen willst musste natürlich den salt zum hashen wieder abrufen...
PHP Code:
$query mysql_query("INSERT INTO user 
    (email, displayName, name, password, bday, salt)
    VALUES    ('
$_POST[email]','$_POST[displayName]','$_POST[name]','$password','$bday', 'PASSWORDUNIQUESTRING'")") 
Und für die Loginfunktion:
PHP Code:
 $query mysql_query("SELECT password, salt FROM user")
while (
$row mysql_fetch_row($query)){
if (
$row->password == md5($_POST['password'].$row->salt){
echo 
"eingeloggt";
break;
}

09/23/2011 14:11 Snake124#12
PHP Code:
    $password md5($_POST['password'].$SALT);
    
$salt "PASSWORDUNIQUESTRING"
erst deklarieren, dann benutzen ;)
PHP Code:
    $salt "PASSWORDUNIQUESTRING";  
    
$password md5($_POST['password'].$SALT); 
dann sollte es mit den codesnippets von xchex problemlos klappen ;)
09/23/2011 17:43 ms​#13
Der Salt ist offensichtlich eine Konstante und muss deshalb auch nicht in der DB gespeichert werden...
09/23/2011 18:24 Che#14
Quote:
Originally Posted by Metin2Spieler97 View Post
Der Salt ist offensichtlich eine Konstante und muss deshalb auch nicht in der DB gespeichert werden...
wäre der salt eine konstante, wäre es unsinnig einen salt zu verwenden o.O
dachte jetzt eigentlich eher, dass der salt in diesem fall n funktionsaufruf ist, aber dann wäre er ja fehlerhaft... wirst wohl recht haben, er hats als konstante definiert.... :facepalm:

zum generieren von salts:
PHP Code:
function random_str($length="8")
{   
$set=array("a","A","b","B","c","C","d","D","e","E","f","F","g","G","h","H","i","I","j","J","k","K","l","L","m","M","n","N","o","O","p","P","q","Q","r","R","s","S","t","T","u","U","v","V","w","W","x","X","y","Y","z","Z","1","2","3","4","5","6","7","8","9");
    
$str '';

    for(
$i 1$i <= $length; ++$i)
    {
        
$str .= $set[mt_rand(0count($set)-1)];
    }

    return 
$str;

zum generieren dann einfach die funktion aufrufen
für einen 8-stelligen salt
PHP Code:
random_str(); 
für nen salt mit anderer länge (zb nem 50 stelligen salt: )
PHP Code:
random_str(50); 
bevor wieder wer rummault: die funktion hab ich selber flott geschrieben, hat mich nichtmal minute gekostet (nur der array hat gedauert :D)

€dit:
Metin2Spieler97, war früher Disconnect oder? Gibt ja noch so einen (Metin2Spieler98)... der taucht iwie ab und an mal wieder in der Main Section auf und hat um die 20k posts o.O
09/23/2011 18:37 ms​#15
Quote:
Originally Posted by 〤Che〤 View Post
wäre der salt eine konstante, wäre es unsinnig einen salt zu verwenden o.O
Naja, es erschwert trotzdem das Cracken eines md5-Hashes. ;O