- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
function unpackLoginAndPas($signed,$iv, $dateSend){
global $crypt, $cryptLast, $defaultDate, $ivsId, $mysqlBaseName, $mysqlBase;
//получаем текущую дату.
if (isset($dateSend) )
$date = $dateSend;
else
$date = $defaultDate;
$query = "SELECT id FROM ivs WHERE val='$iv';" ;
$query = $mysqlBase->query($query);// or die (compactResult('error','криворукий программист!'));
//есть ли такой маркер безопасности?
if ($query->num_rows)//раз есть, то надо послать за другим маркером. Такой уже не годиться.
die (compactResult('error','bad iv marker,pls generate new iv'));
//запоминаем такой маркер безопасности, и больше под ним не пускаем.
//получаем id автоинкремент
$myBase = $mysqlBase->query("SHOW TABLE STATUS FROM $mysqlBaseName") or die (compactResult('error','SystemTable not get (')); ;
$result = false;
//поиск времени изменения БД.
$dateSrv = (int)( $date->getTimestamp() / 1000 );
while($row = $myBase->fetch_assoc()){
if ($row['Name'] !== "ivs" )
continue;
$ivsId = $row["Auto_increment"];
}
$userIP = getUserIpAddr();
$mysqlBase->query("INSERT INTO ivs(val,IP) VALUES('$iv','$userIP')") or die(compactResult('error','криворукий программист!'));
//составляем строку из даты, которая у нас будет ключем. 1 раз в 5 минут она становиться другой.
$decodeKey = /*формирование строки от даты*/
$dateLast = $date->add( DateInterval::createFromDateString(' 5 minuts ' ) );
$decodeKeyLast = /*формирование строки от даты*/
//var_dump($decodeKey);
$decodeKey = md5($decodeKey);
$decodeKeyLast = md5 ( $decodeKeyLast );
mcrypt_generic_init ($crypt,$decodeKey,$iv);
mcrypt_generic_init ($cryptLast,$decodeKeyLast,$iv);
//декриптуем
$encDataLoginAndPass = rtrim (mdecrypt_generic($crypt,$signed));
$encDataLoginAndPassLast = rtrim (mdecrypt_generic($cryptLast,$signed));
//если правильный был и ключ(время не истекло) и
//var_dump($encDataLoginAndPass);
$encDataLoginAndPass = json_decode ($encDataLoginAndPass,true) or ( ($decodeKey = $decodeKeyLast ) and json_decode ($encDataLoginAndPassLast,true) )or die(compactResult('error','Key time out.'));
//в поле secdata в POST будет лежать массив, декодированный
mcrypt_generic_init ($crypt,$decodeKey,$iv);
$temp = array_keys($encDataLoginAndPass);
$encData = array('login'=>$temp[0], 'password'=>end($encDataLoginAndPass));
$encPost = mdecrypt_generic($crypt, base64_decode( $_POST['secdata'] ) );
$encData['post'] = json_decode (rtrim($encPost)) or die(compactResult('error','post uncompressed!'));
//деинит
mcrypt_generic_deinit ($crypt);
//раз все прошло успешо, возвращаем массив с логином и паролем, который проверяем дальше. Тут даже использование вместо пароля, его хеша не поможет от хака. будем надеятся на алгоритм шифровки. Хотя есть взять, и знать что тут будет одинаковая информация, то вычислить её по паре перехваченных обращений не составит труда. Надо бы переделать на хеш от логина с паролем. Хотя и это врядли поможет. Надо взять что-то изменяемое. От чего можно будет отталкиваться. Но это надо обдумывать.
return $encData;
};
попытка шифрования в 1-м проекте.
Человек первый раз писал на php. Оно и видно...