Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2018, 11:18   #1
CyberX346
Пользователь
 
Регистрация: 09.09.2018
Сообщений: 10
Злость AES CBC 256 на клиенте синхронно с сервером

В общем я слабоват в шиформании и у меня есть некоторого рода капча, которая передается в виде координат сверки пользовательского ввода в формате JSON. Поскольку координаты ни чего не стоит увидеть невооруженным глазом есть неприятность связанная с возможностью обхода защиты.

Хотелось бы какой-то простейший алгоритм шифрования синхронный с сервером на стороне клиента. То есть я должен иметь возможность зашифровать данные на сервере и расшифровать на клиента, а потом зашифровать отправку на клиенте и расшифровать на сервере.

Проблема в том, что все библиотеки, которые я смотрел шифровать то умеют и даже дешифровать, но клиентские прибулды очень тяжеловесные и не совместимы с open ssl на сервере, что делает невозможным декодирование крипта на сервере.


Нужен какой-то простой алгоритм шифрования строки json, который содержит конкатенующее строковое содержимое координат блоков.

Я при написании системы использовал AES CBC 256, которой мне в купе с измененнным вектором шифрования вполне достаточно для защиты, но теперь не могу найти ни одну клиентскую пару для этого.

Подскажите какой-то синхронный алгоритм шифрования пожалуйста.
CyberX346 вне форума Ответить с цитированием
Старый 09.09.2018, 11:25   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И чем это поможет? Клиент же в любом случае их получит в расшифрованном виде, значит и тот, кто обходит, сможет повторить это.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.09.2018, 11:32   #3
CyberX346
Пользователь
 
Регистрация: 09.09.2018
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И чем это поможет? Клиент же в любом случае их получит в расшифрованном виде, значит и тот, кто обходит, сможет повторить это.
Нет. Клиент их получит в зашифрованном виде. В том и фишка.
CyberX346 вне форума Ответить с цитированием
Старый 09.09.2018, 11:45   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И? Вы защищаетесь от перехвата трафика на пути от сервера к клиенту? Так для этого HTTPS есть...
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.09.2018, 12:42   #5
CyberX346
Пользователь
 
Регистрация: 09.09.2018
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И? Вы защищаетесь от перехвата трафика на пути от сервера к клиенту? Так для этого HTTPS есть...
нет. можно сделать console.log и получить значение передаваемых значений.
CyberX346 вне форума Ответить с цитированием
Старый 09.09.2018, 12:45   #6
CyberX346
Пользователь
 
Регистрация: 09.09.2018
Сообщений: 10
По умолчанию

Короче лохопотные алгоритмы не могут зашифровать строку вида :

{"key":"III*M-0:0:75|K-1:50:50|P-0:75:75|J-0:25:50|B-0:25:0|N-0:25:75|A-0:0:0|H-0:75:25|F-1:25:25|G-1:50:25|C-0:50:0|O-0:50:75|E-0:0:25|I-0:0:50|L-0:75:50|D-0:75:0"}

далее ее нужно расшифровать на клиенте и снова зашифровать и передать на сервер, а там расшифровать.

видимо придется самопис делать
CyberX346 вне форума Ответить с цитированием
Старый 09.09.2018, 12:50   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вы так и не поняли, что все что может сделать клиент (браузер), может сделать и тот клиент, что обходит (бот, ...)?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.09.2018, 15:35   #8
CyberX346
Пользователь
 
Регистрация: 09.09.2018
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вы так и не поняли, что все что может сделать клиент (браузер), может сделать и тот клиент, что обходит (бот, ...)?
А вот теперь боты у меня сосут вроде как.

И так: сервер генерирует паттерн который пользователь должен повторить в точности. Я кодирую его в виде координат меток в формате JSON и посылаю на клиент. Пользовательский ввод шифруется очень просто но достаточно(римские цыфры + char code + json). Сервер при проверке разворачивает данные из непечатаемых сиволов и восстанавливает последовательность, далее сверяет капчу и ставит флаг можно/нельзя.

Ни одна библиотека AES не подошла - работают в разнобой с сервером. Всем спасибо. Решил самописом.


Код:

		$.event('input[type="submit"]', 'click', function(e) {

				//e.preventDefault();

				const sectors = $.dom('#drawpane div');

				if( window.flag ) {

					let matrix = [];
					let counter = 0;

					for( let a of sectors ) {

						let coords = a.dataset.xy;
						let state = a.dataset.selected === 'true' ? 1 : 0;

						matrix[counter] = state +':'+ coords;
						counter++;

					}

					const patterns_match = matrix.join('|');

					function encoder(str) {
						
						var encoded = "";
						
						for (let j=0; j < str.length; j++) {
							var a = str.charCodeAt(j);
							var b = a ^ 51; 
							encoded = encoded+String.fromCharCode(b);
						}
						
						return encoded;
					}


					let crypt = encoder( "{\"value\":"+ '"' +window.pattern_id +'*'+ patterns_match +'"'+ "}" );
					let string = '';

					for (var i = 0; i < crypt.length; i++) {
  						string += crypt.charCodeAt(i);
  						if( i < crypt.length -1 ) {
  							string += '|';
  						}
					}

					$.attr('input[name="revolver_captcha"]', {'value': string});
				}

Код:
 	public static function generate() {

 		$pattern = array_rand(self::$patterns, 1);
	
 		return $pattern .'*'. self::$patterns[$pattern];
 	}

 	public static function randomize() {

 		$pattern = array_rand(self::$patterns, 1);
 		$crypted = [];
 		$counter = 0;
 		$result  = '';

 		$symbols = [
 			0  => 'A', 1  => 'B', 2  => 'C',
 			3  => 'D', 4  => 'E', 5  => 'F',
 			6  => 'G', 7  => 'H', 8  => 'I',
 			9  => 'J', 10 => 'K', 11 => 'L',
 			12 => 'M', 13 => 'N', 14 => 'O',
 			15 => 'P'
 		];

 		$numbers = [
 			0 => 0, 1 => 'I', 2 => 'II', 3 => 'III', 4 => 'IV', 5 => 'V', 6 => 'VI', 7 => 'VII', 8 => 'VIII', 9 => 'IX', 10 => 'X'
 		];

 		foreach( explode('|', self::$patterns[$pattern]) as $payload ) {
 			$crypted[] = $symbols[$counter++] .'-'. $payload;
 		}

 		shuffle($crypted);

 		foreach ($crypted as $payload) {
 			$result .= $payload .'|';
 		}
	
 		return $numbers[$pattern] .'*'. rtrim($result, '|');

 	}

 	public static function decode( $str ) {

		$decoded = "";

		for( $i = 0; $i < strlen($str); $i++ ) {
			$b = ord($str[$i]);
			$a = $b ^ 51;  // <-- must be same number used to encode the character
			$decoded .= chr($a);
		}
	
		return $decoded;

 	}


 	public static function compensation( $str ) {

 		$str = explode('|', $str);
 		$string = '';

 		foreach($str as $s) {
 			$string .= chr($s);
 		}

 		return $string;
 	}

 	public static function check( $val1, $id ) {
 		return $val1 === self::$patterns[$id] ? true : false;  	
 	}

}

Код:
										if(isset($k['revolver_captcha'])) {

											$captcha_data = $captcha::decode($captcha::compensation($k['revolver_captcha'])) ;
											$captcha_data = explode( '*' , json_decode( $captcha_data, true )['value'] );

											if( $captcha::check($captcha_data[1], $captcha_data[0]) ) {
												define('form_pass', 'pass');
											}

										}

В капчу можно поиграть тут, если интересно. Это почти как у Google, только у меня без нейронной сети, картинок независимая и проще.

Могу за деньги написать модули для ваших сыстэм. Плагыны и так далее. Пишите в личку.

Последний раз редактировалось CyberX346; 09.09.2018 в 15:38.
CyberX346 вне форума Ответить с цитированием
Старый 09.09.2018, 16:41   #9
CyberX346
Пользователь
 
Регистрация: 09.09.2018
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вы так и не поняли, что все что может сделать клиент (браузер), может сделать и тот клиент, что обходит (бот, ...)?
Окей. Все таки хотел пропустить мимо глаз, однако, подскажите прнимер такого клиента, который сможет произвести действие, которое совершает человек.

Тут даже анализ картинки не поможет так как речь идет об программном синтетическом canvas. Кто ради спама в профилях и комментариях станет писать сложный бот, умеющий обходить двойное шифрование, сложный парсинг и имитировать действия пользователя?

Хрумер чтоли, который задуман как спамер помоечников со стандартными капчами?

Я думаю мне придуманного способа защиты хватит по меньшей мере лет на 5-10.

Вы превозносите не тех разработчиков как мне кажется. Хотя я могу ошибаться ...

Но в любом случае никто не будет точить алгоритм конкретно под мою CMS, которой пользуется человек 20 в данное время.
CyberX346 вне форума Ответить с цитированием
Старый 09.09.2018, 19:10   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут это? Считайте любого клиента ботом. Если вы отправляете ответ клиенту (хоть 100500 раз зашифрованный если у клиента есть все для его расшифровки), то больше не надо никаких хитростей для обхода же, и так все есть.

Поэтому надо просто не изобретать велосипед и не давать ответ клиенту.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Протокол Диффи-Хеллмана и AES-256 KRONMAG Безопасность, Шифрование 2 04.07.2017 13:11
Реализация AES 256 на СИ. Grem1in Общие вопросы C/C++ 2 20.04.2015 08:08
Загрузка картинок на сервер с помощью Ajax синхронно andrey_besp JavaScript, Ajax 1 16.10.2014 08:56
aes 256 cbc - шифрование строки frommars Общие вопросы C/C++ 3 19.10.2012 12:54
Иконки 256 на 256 в Delphi 7 _PROGRAMM_ Помощь студентам 2 30.04.2011 15:19