gibt es hier irgendwelche passagen die mit php 4.4 probleme machen?
<?php
/**
* @license http://opensource.org/licenses/gpl-2.0.php The GNU General Public License (GPL)
* @copyright (C) 2000-2012 ilch.de
*/
defined('main') or die('no direct access');
/**
* PwCrypt
*
* Achtung: beim �bertragen von mit 2a erzeugten Passw�rtern auf einen anderen PC/Server,
* dort kann es u.U. passieren, dass eine Authentifikation nicht mehr m�glich ist,
* da 2a auf einigen System fehlerhafte Ergebnisse liefert.
* Verwende dann die $backup Parameter bei checkPasswd
*
* @author finke <Surf-finke@gmx.de>
* @autor Mairu
* @copyright Copyright (c) 2012 - 2013
*/
class PwCrypt
{
const LETTERS = 1; //0001
const NUMBERS = 2; //0010
const ALPHA_NUM = 3; //0011
const URL_CHARACTERS = 4; //0100
const FOR_URL = 7; //0111
const SPECIAL_CHARACTERS = 8; //1000
//Konstanten f�r die Verschl�sselung
const MD5 = '1';
const BLOWFISH_OLD = '2a';
const BLOWFISH = '2y';
const BLOWFISH_FALSE = '2x';
const SHA256 = '5';
const SHA512 = '6';
private $hashAlgorithm = self::SHA256;
/**
* PwCrypt::checkHashStrength wird immer false zur�ckliefern, wenn dieser Wert true ist
*
* @var boolean
*/
private $dontCheckHashStrength = false;
/**
* @param string $lvl Gibt den zu verwendenden Hashalgorithmus an (Klassenkonstante)
*/
public function __construct($lvl = '')
{
if (!empty($lvl)) {
$this->hashAlgorithm = $lvl;
}
// wenn 2x oder 2y gew�hlt, aber nicht verf�gbar, nutze 2a
if (version_compare(PHP_VERSION, '5.3.7', '<')
&& in_array($this->hashAlgorithm, array(self::BLOWFISH, self::BLOWFISH_FALSE))
) {
$this->hashAlgorithm = self::BLOWFISH_OLD;
}
// Pr�fen welche Hash Funktionen Verf�gbar sind. Ab 5.3.2 werden alle mitgeliefert
if (version_compare(PHP_VERSION, '5.3.2', '<')) {
if ($this->hashAlgorithm === self::SHA512 && (!defined('CRYPT_SHA512') || CRYPT_SHA512 !== 1)) {
$this->hashAlgoriathm = self::SHA256; // Wenn SHA512 nicht verf�gbar, versuche SHA256
}
if ($this->hashAlgorithm === self::SHA256 && (!defined('CRYPT_SHA256') || CRYPT_SHA256 !== 1)) {
$this->hashAlgorithm = self::BLOWFISH_OLD; // Wenn SHA256 nicht verf�gbar, versuche BLOWFISH
}
if ($this->hashAlgorithm === self::BLOWFISH_OLD && (!defined('CRYPT_BLOWFISH') || CRYPT_BLOWFISH !== 1)) {
$this->hashAlgorithm = self::MD5; // Wenn BLOWFISH nicht verf�gbar, nutze MD5
}
}
/* Wenn 2a oder 2x gew�hlt, aber 2y verf�gbar: nutze trotzdem 2y, da dies sicherer ist; */
if (version_compare(PHP_VERSION, '5.3.7', '>=')
&& in_array($this->hashAlgorithm, array(self::BLOWFISH_OLD, self::BLOWFISH_FALSE))
) {
$this->hashAlgorithm = self::BLOWFISH;
}
}
/**
* Erstellt eine zuf�llige Zeichenkette
*
* @param integer $size L�nge der Zeichenkette
* @param integer $chars Angabe welche Zeichen f�r die Zeichenkette verwendet werden
* @return string
*/
public static function getRndString($size = 20, $chars = self::LETTERS)
{
if ($chars & self::LETTERS) {
$pool = 'abcdefghijklmnopqrstuvwxyz';
$pool .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
}
if ($chars & self::NUMBERS) {
$pool .='0123456789';
}
//in einer URL nicht reservierte Zeichen
if ($chars & (self::URL_CHARACTERS | self::SPECIAL_CHARACTERS)) {
$pool .= '-_.~';
}
//restiliche Sonderzeichen
if ($chars & self::SPECIAL_CHARACTERS) {
$pool .= '!#$%&()*+,/:;=?@[]';
}
$pool = str_shuffle($pool);
$pool_size = strlen($pool);
$string = '';
for ($i = 0; $i < $size; $i++) {
//TODO: Zufallszahlen aus /dev/random bzw /dev/urandom wenn verf�gbar
$string .= $pool[mt_rand(0, $pool_size - 1)];
}
return $string;
}
/**
* Pr�ft, ob der �bergebene Hash, im crypt Format ist
*
* @param mixed $hash
* @return boolean
*/
public static function isCryptHash($hash)
{
return (preg_match('/^\$([156]|2[axy])\$/', $hash) === 1);
}
/**
* Wenn der �bergebene Hash einen schw�cheren Algorithmus verwendet (kleinere Zahl) wird true zur�ck geliefert
* (schw�chere Hashs werden an andere Stelle (user_pw_check()) mit neuem Algorithmus gespeichert)
*
* @param string $hash
* @return boolean
*/
public function checkHashStrength($hash)
{
$matches = array();
if ($this->dontCheckHashStrength) {
return false;
}
if (!self::isCryptHash($hash)) {
return true;
}
if (preg_match('/^\$([1256])([axy])?\$/', $hash, $matches) === 1) {
$hashAlgoNumber = $matches[1];
$hashAlgoLetter = isset($matches[2]) ? $matches[2] : '';
if (preg_match('/^([1256])([axy])?$/', $this->hashAlgorithm, $matches) === 1) {
if ($matches[1] > $hashAlgoNumber) {
return true;
} elseif ($matches[1] === '2' && $hashAlgoNumber === '2' && $matches[2] > $hashAlgoLetter) {
return true;
}
}
}
return false;
}
/**
* Gibt den Code der gew�hlten/genutzen Hashmethode zur�ck (Crypt Konstante)
*
* @return string
*/
public function getHashAlgorithm()
{
return $this->hashAlgorithm;
}
/**
* Erstellt ein Hash f�r das �bergebene Passwort
*
* @param string $passwd Klartextpasswort
* @param string $salt Salt f�r den Hashalgorithus
* @param integer $rounds Anzahl der Runden f�r den verwendeten Hashalgorithmus
* @return string Hash des Passwortes (Ausgabe von crypt())
*/
public function cryptPasswd($passwd, $salt = '', $rounds = 0)
{
$salt_string = '';
switch ($this->hashAlgorithm) {
case self::SHA512:
case self::SHA256:
$salt = (empty($salt) ? self::getRndString(16, self::LETTERS | self::NUMBERS) : $salt);
if ($rounds < 1000 || $rounds > 999999999) {
$rounds = mt_rand(2000, 10000);
}
$salt_string = '$' . $this->hashAlgorithm . '$rounds=' . $rounds . '$' . $salt . '$';
break;
case self::BLOWFISH:
case self::BLOWFISH_OLD:
$salt = (empty($salt) ? self::getRndString(22, self::LETTERS | self::NUMBERS) : $salt);
if ($rounds < 4 || $rounds > 31) {
$rounds = mt_rand(6, 10);
}
$salt_string = '$' . $this->hashAlgorithm . '$' . str_pad($rounds, 2, '0', STR_PAD_LEFT) . '$' . $salt . '$';
break;
case self::MD5:
$salt = (empty($salt) ? self::getRndString(12, self::LETTERS | self::NUMBERS) : $salt);
$salt_string = '$' . $this->hashAlgorithm . '$' . $salt . '$';
break;
default:
return false;
}
$crypted_pw = crypt($passwd, $salt_string);
if (strlen($crypted_pw) < 13) {
return false;
}
return $crypted_pw;
}
/**
* Pr�ft, ob das Klartextpasswort dem Hash "entspricht"
*
* @param mixed $passwd Klartextpasswort
* @param mixed $crypted_passwd Hash des Passwortes (aus der Datenbank)
* @param boolean $backup wenn Check fehlschl�gt und das alte passwort mit BLOWFISH_OLD verschl�sselt wurde,
* werden beide Varianten noch einmal explizit gepr�ft, wenn verf�gbar. Nur nach Transfer der Datenbank verwenden,
* da dies ein Sicherheitsrisiko darstellen kann
* @return boolean
*/
public function checkPasswd($passwd, $crypted_passwd, $backup = false)
{
if (empty($crypted_passwd)) {
return false;
}
if (self::isCryptHash($crypted_passwd)) {
$new_chrypt_pw = crypt($passwd, $crypted_passwd);
if (strlen($new_chrypt_pw) < 13) {
return false;
}
} else {
$new_chrypt_pw = md5($passwd);
}
if ($new_chrypt_pw == $crypted_passwd) {
return true;
} else {
if ($backup == true
&& version_compare(PHP_VERSION, '5.3.7', '>=')
&& substr($crypted_passwd, 0, 4) == '$2a$'
) {
$password_x = '$2x$' . substr($crypted_passwd, 4);
$password_y = '$2y$' . substr($crypted_passwd, 4);
$password_neu_x = crypt($passwd, $password_x);
$password_neu_y = crypt($passwd, $password_y);
if ($password_neu_x === $password_x || $password_neu_y === $password_y) {
return true;
}
}
}
return false;
}
}



