Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Нужен алгоритм шифрования JS Client<->Server (https://javascript.ru/forum/misc/73989-nuzhen-algoritm-shifrovaniya-js-client-server.html)

xShift 03.06.2018 18:58

Нужен алгоритм шифрования JS Client<->Server
 
В общем есть данные вида:

{"key":"1*0:0:0|0:25:0|0:50:0|0:75:0|0:0:25|1:25:25|0:50:25|0:75:25|0:0:50|1:25:50|1:50:50|0:75:50|0:0:75|0:25:75|0:50:75|0:75:75"}


Это фрагмент паттерна капчи, который бы хотелось зашифровать. Я немного поискал и не нашел подходящего алгоритма, такого, который будет синхронно работать в двустороннем порядке.

То есть шифроваться на сервере и дешифроваться на клиенте, а после ввода пользовательских данных снова шифроваться на клиенте и потом дешифроваться на сервере.

Подскажите пример таких функций, которые можно было бы модифицировать по своей логике, чтобы алгоритм требовал только хэша шифрования. Кода должно быть минимум, чтобы не замарать клиент.

Тут понятно, что нельзя использовать open_ssl и прочие библиотеки. Нужна какая-то простая логика кодирования, чтобы портировать ее на JS.

MallSerg 04.06.2018 02:29

Гугли реализации AES на JS

xShift 04.06.2018 12:32

MallSerg, щас посмотрел несколько решений - говнокод унылый. У большинства не меняется вектор шифрования и первый конкатенационный хэш всегда статичен. При том, что на JS этот ключ шифрования у большинства транслируется в массив байтов и даже не поддерживает символы кроме HEX-DEC заявленная совместимость с open ssl в жопе.

У меня была идея сделать серверную генерацию ключа на 5 минут сроком актуальности, которая будет сдерживаться по JSON fetch и криптовать на клиенте капчу и декриптовать. Но c моим AES-CBC 256 это оказалось несовместимо, а у меня только вектор поменян и совсем нет конкатенующего паливного хэша.


Я щас просто сделаю резку строки и перетасовку - все равно будут долго догадываться и не догадаются скорее всего. Осталось подумать на сколько частей резать и в каком порядке перетасовывать. Кароче вот такое я шифрование придумал.

А то эти мужики старые как говно мамонта и код у них такой же дряхлый.

xShift 04.06.2018 12:53

Кароче вот ... Добавляем порядок с алфавитными индексами на сервере и тасуем. На клиенте делаем sort(), что восстанавливает порядок массива.

let test = {"key":"1*G-0:50:25|B-0:25:0|C-0:50:0|D-0:75:0|E-0:0:25|F-1:25:25|H-0:75:25|I-0:0:50|J-1:25:50|K-1:50:50|L-0:75:50|M-0:0:75|N-0:25:75|O-0:50:75|P-0:75:75|A-0:0:0"};
		
		let pattern = test.key.split('*')[0];
		let coords	= test.key.split('*')[1].split('|');
		

		console.log(coords.sort()) // return order

		function compareRandom(a, b) {
		  return Math.random() - 0.5;
		}


		console.log(coords.sort(compareRandom)) // randomize


С учетом того, что капчедрочеры обычно считывают изображение мы имеем шанс не попасть под автоматизированный алгоритм вычисления капчи - ведь она отрисовывается canvas. Далее после ввода паттерна опять мы перетасовываем и отправляем на сервер который делает тоже самое.

Мне кажется лет на 10 этого алгоритма хватит.

j0hnik 04.06.2018 13:02

Цитата:

Сообщение от xShift
Мне кажется лет на 10 этого алгоритма хватит.

сейчас нейронки капчи не хуже людей угадывают.

ruslan_mart 04.06.2018 14:03

Можно как-то так:
var Shuffler = (function() {

	var joinReplaceCallback = function() {
		return Math.random() > 0.5 ? 'e' : 'f';
	};

	return {
		decode: function(array, key) {
			var tempArray = array.slice(); //copy source array

			array.splice(0, array.length); //clear source array
			key = key.split(/[ef]/);

			for(var i = 0, value; i !== key.length; i++) {
				value = parseInt(key[i], 14);
				array[value] = tempArray[i];
			}
		},
		encode: function(array) {
			var indexes = [],
				key = [],
				tempArray = array.slice(), //copy source array
				value;

			array.splice(0, array.length); //clear source array

			while(array.length !== tempArray.length) {
				value = Math.floor(Math.random() * tempArray.length);

				if(indexes.indexOf(value) === -1) {
					array.push(tempArray[value]);
					indexes.push(value);
					key.push(value.toString(14));
				}
			}

			return key.join('$').replace(/\$/g, joinReplaceCallback);
		}
	};

})();


var array = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

var secretKey = Shuffler.encode(array);

console.log(array, secretKey);

Shuffler.decode(array, secretKey);

console.log(array);

xShift 04.06.2018 15:46

ruslan_mart, неплохо :) я замешал все же на array sort. Только еще добавил римские цифры что парсить не хотели. Думаю еще сделать рандомизацию пути получения капчи по сессии. Тогда точно этого хватит.

А нейронки - да. Но хрумер уже с писькой во рту и этого пока достаточно.


Часовой пояс GMT +3, время: 16:09.