Самописная ф-ция шифрования и MySql

bobo

Новичок
Всем утра, помогите ламеру решить проблему.
Есть небольшой класс шифрования:
PHP:
class myCrypt {
	
	
	
	private static $salt = "c59d0e730a3bd00239a146a7acd5ca62"; //cryptSalt
	private static $overSalt = "3939e70c95745e67a4fb234882e6127b"; //cryptOverSalt
	
	
	
	private function __construct($salt,$overSalt) {
		
		$this -> salt = $salt;
		$this -> seq = $overSalt;
		
	}
	
	
	
	public static function encode($str) {
		
			if ($str != NULL) {
				
				$gamma = "";
				
					while (strlen($gamma) < strlen($str)) {
						
						$overSalt = sha1($gamma.$overSalt.$salt,true);
						$gamma .= substr($overSalt,0,8);
						
					}
				
				return $str^$gamma;
			
			}
		
		return NULL;
		
	}
	

	
}
Проверяем работу:

PHP:
require_once "../lib/crypt.php";

$str = "16";

$x = myCrypt::encode($str);

echo "Строка для шифрования: <u>".$str."</u>";
//echo "<br><br>Шифруем: <u>".$x."</u>";
echo "<br><br>Шифруем:  <u>".htmlspecialchars($x)."</u>";
echo "<br><br>Дешифруем:  <u>".htmlspecialchars(myCrypt::encode($x))."</u>";

($str === myCrypt::encode($x)) ? $itog = "Все ок" : $itog = "Ошибка";

echo "<br><br><br><br>Сравниваем строку до шифрования и после: <b>".$itog."</b>";
Тут все ок, работает как часы.

Все это делается для того, что б в БД можно было хранить данные в зашифрованном виде.
Тут возникла забавная проблема: при записи в БД двузначных чисел, которые оканчиваются на "2", "3", "4", "5", "9" и последующем их выдергивании расшифровке и выводе в браузер пропадает вышеназванная цифра)) Т.е. если ввести 23 и сохранить в БД - выведет 2, если ввести 65 - выведет 6 и т.д.

При проверке без записи в БД вторым кодом все ок :) Тип поля в БД varchar(250), пробывал менять - не помогает.

+ Еще хотел спросить: сейчас все это шифруется с помощью стандарта sha1
PHP:
$overSalt = sha1($gamma.$overSalt.$salt,true);
пробывал использовать md5 - вышеописанная проблема пропадает.
Повторяю, что я ламер, подскажите, есть ли принципиальная разница, какой именно стандарт шифрования использовать и вообще в целом вы сами бы стали использовать нечто подобное для защиты информации в БД, т.е. конкретно данный способ имеет право на жизнь ?

Заранее благодарю за советы!
 

Wicked

Новичок
1) Шифровать нужно с помощью нормальных алгоритмов шифрования, а не писать на коленке подобие оного.
http://www.php.net/manual/en/mcrypt.ciphers.php

2) Проблема наверняка в том, что то, что сохраняется в MySQL - бинарные данные. Как с ними обходится PHP при составлении запроса и как их сохраняет MySQL - осталось за кадром, а там наверняка что-нибудь теряется, типа пробела в конце строки. Я бы порекомендовал хранить в базе бинарные данные, упакованные с помощью hex или base64.
 

bobo

Новичок
1. Так тут получается есть теоретическая вероятность, что в случае кражи БД всю информацию можно будет легко расшифровать, пользуясь готовыми php функциями. В случае же с самописной такая вероятность намного меньше, не ?

2. Т.е. после кодирования моей функцией упаковывать докучи base64_encode перед записью в БД ?
 

Wicked

Новичок
1) В случае, если злоумышленник будем иметь возможность записать что-то длинное в твою базу, затем ее украдёт? А такую идею насчёт XOR'а ему может подкинуть другая проверка: залить 2 почти одинаковые строки... которые в бд лягут ну очень похожими друг на друга. И ему даже твоя соль не нужна будет, как и знание всех деталей работы алгоритма. Вот и рассыпался твой супер-секретный алгоритм. В то же время, даже какой-нибудь AES без знания ключа шифрования взломать не удастся. Так что рекомендую не заниматься ерундой.

2) Например.
 

bobo

Новичок
1. Ок, буду думать.
2. Уже проверил, все ок.
Спасибо :)

Если еще у кого-то есть мнения по первому пункту, с удовольствием выслушаю.
 

Wicked

Новичок
3) А что ты собрался шифровать?

4) У тебя всякие ошибки в классе типа обращения к неопреленным переменным. Советую включить показ ошибок. И вообще, зачем в том классе конструктор?
 

bobo

Новичок
3) А что ты собрался шифровать?

4) У тебя всякие ошибки в классе типа обращения к неопреленным переменным. Советую включить показ ошибок. И вообще, зачем в том классе конструктор?
3. Данные клиентов предприятия (имя, телефон)
4. Ээм, так там вроде как 3 переменные, и вроде как все определены, разве нет ? о_О
По поводу конструктора: читал книгу Котерова - у него там подобным образом переменные обрабатываются, уж не знаю канечно, насколько это корректно. Что с этим не так ?

upd. Да, тут напутано немного с переменными, уже исправил, спасибо :)
 

bobo

Новичок
з.ы. Еще один ламерский вопрос: конструктор вызывается только тогда, когда мы объявляем $class = new Class(); ?
Т.е. в моем случае myCrypt::encode($str) конструктор же не вызывается, да ?
 
Сверху