Есть небольшой класс шифрования:
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;
}
}
Проверяем работу:
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
$overSalt = sha1($gamma.$overSalt.$salt,true);
пробывал использовать md5 - вышеописанная проблема пропадает.
Повторяю, что я ламер, подскажите, есть ли принципиальная разница, какой именно стандарт шифрования использовать и вообще в целом вы сами бы стали использовать нечто подобное для защиты информации в БД, т.е. конкретно данный способ имеет право на жизнь ?
Заранее благодарю за советы!
Спустя 2 часа, 59 минут (14.03.2012 - 10:26) bobo написал(а):
Вообще нЕчего сказать ? о_О
Спустя 11 минут, 24 секунды (14.03.2012 - 10:37) ADiel написал(а):
while (strlen($gamma) < strlen($str)) {
Кодировка UTF8 ?
В этой кодировке русская буква - 2 байта, цифра - 1 байт
Кодировка UTF8 ?
В этой кодировке русская буква - 2 байта, цифра - 1 байт
Спустя 1 минута, 16 секунд (14.03.2012 - 10:38) Игорь_Vasinsky написал(а):
Может
Цитата |
$gamma .= substr($overSalt,0,8); |
sha1 - 40 символов
md5 - 32
ADiel
там нет кириллицы - тока хэш
Спустя 41 секунда (14.03.2012 - 10:39) Игорь_Vasinsky написал(а):
а.. пардон. хэшируется потом.
Спустя 1 минута, 17 секунд (14.03.2012 - 10:40) Игорь_Vasinsky написал(а):
не понял этот момент
0. if ($str != NULL)
1. $gamma = "";
2. while (strlen($gamma) < strlen($str)) {
0. if ($str != NULL)
1. $gamma = "";
2. while (strlen($gamma) < strlen($str)) {
Спустя 4 минуты, 59 секунд (14.03.2012 - 10:45) bobo написал(а):
Цитата (Игорь_Vasinsky @ 14.03.2012 - 12:40) |
не понял этот момент 0. if ($str != NULL) 1. $gamma = ""; 2. while (strlen($gamma) < strlen($str)) { |
if ($str != NULL) - сделано для того, что б при выборке из БД, поля со значением "NULL" игнорировались (если условие убрать, то значения таких полей выводятся как "0").
В общем по поводу "съедания" цифры подсказали: перед записью в БД обрабатывать результат работы моей функции функцией base64_encode, при чтении из БД соответственно base64_decode - вроде все ок сейчас.
По поводу целесообрасности использования такого варианта хотел бы услышать мнения
Спустя 2 минуты, 56 секунд (14.03.2012 - 10:48) ADiel написал(а):
gzinflate с паролем и в бинарный вид в базу.
Получится нормальное обратимое шифрование =))
Получится нормальное обратимое шифрование =))
Спустя 9 минут, 28 секунд (14.03.2012 - 10:58) bobo написал(а):
Цитата (ADiel @ 14.03.2012 - 12:48) |
gzinflate с паролем и в бинарный вид в базу. Получится нормальное обратимое шифрование =)) |
Так тут получается есть теоретическая вероятность, что в случае кражи БД всю информацию можно будет легко расшифровать, пользуясь готовыми php функциями. В случае же с самописной такая вероятность намного меньше, не ?
Спустя 1 минута, 55 секунд (14.03.2012 - 11:00) ADiel написал(а):
Пароль поставь семиведерный. В любом случае все можно расшифровать. Это лишь вопрос времени.
Тем более твой алгоритм всем известен на этом форуме =)))
+ мой вариант куда производительнее
Тем более твой алгоритм всем известен на этом форуме =)))
+ мой вариант куда производительнее
Спустя 3 минуты, 29 секунд (14.03.2012 - 11:03) bobo написал(а):
Ок, спасибо