С помощью данного класса можно реализовать внутриигровую + форумную регистрацию, т.е юзать один аккаунт, иногда это очень удобно.
Функция, присутствующие в классе, их всего три:
generateSalt() - Генерирует ключ шифрования
legacyEscape() - Необходимо для старых версий IP.Board
encryptedPassword() - Шифрование пароля, именно эту функцию мы и будем разбирать.
В функцию encryptedPassword передаются два параметра, пароль в чистом виде и ключ шифрования, так называемая "соль".
Далее функция сложит все данные в одну строчку, предварительно установив между паролем и солью семь символов ($2a$13$), примерно получится вот так:
пароль$2a$13$соль
Далее функция хэширует с помощью стандартного алгоритма UNIX, получается вот так:
$2a$13$h3jQKRpUAhlpwawzMrmbhu3mxlaVM9YPNtlyjs5QvYMhY9q0teqJm
admin$2a$13$h3jQKRpUAhlpwawzMrmbhz
Как вариант можно пропатчить IPS\Member\Member.php и сделать единую регистрацию с форума, а можно юзать этот класс и внедрить уже в вашу серверную обвязку регистрацию и авторизацию.
Сам класс для работы на вашей обвязке:
class ips {
public function generateSalt() {
$salt = '';
for ( $i=0; $i<22; $i++ ) {
do {
$chr = rand( 48, 122 );
}
while ( in_array( $chr, range( 58, 64 ) ) or in_array( $chr, range( 91, 96 ) ) );
$salt .= chr( $chr );
}
return $salt;
}
public static function legacyEscape( $val ) {
$val = str_replace( "&" , "&" , $val );
$val = str_replace( "<!--" , "<!--" , $val );
$val = str_replace( "-->" , "-->" , $val );
$val = str_ireplace( "<script" , "<script" , $val );
$val = str_replace( ">" , ">" , $val );
$val = str_replace( "<" , "<" , $val );
$val = str_replace( '"' , """ , $val );
$val = str_replace( "\n" , "<br />" , $val );
$val = str_replace( "$" , "$" , $val );
$val = str_replace( "!" , "!" , $val );
$val = str_replace( "'" , "'" , $val );
$val = str_replace( "\\" , "\" , $val );
return $val;
}
public function encryptedPassword($password, $salt)
{
if (mb_strlen($salt) === 22) {
return crypt($password,'$2a$13$'.$salt);
} else {
return md5(md5($salt).md5($this->legacyEscape($password)));
}
}
}