Нужен алгоритм шифрования 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. |
Гугли реализации AES на JS
|
MallSerg, щас посмотрел несколько решений - говнокод унылый. У большинства не меняется вектор шифрования и первый конкатенационный хэш всегда статичен. При том, что на JS этот ключ шифрования у большинства транслируется в массив байтов и даже не поддерживает символы кроме HEX-DEC заявленная совместимость с open ssl в жопе.
У меня была идея сделать серверную генерацию ключа на 5 минут сроком актуальности, которая будет сдерживаться по JSON fetch и криптовать на клиенте капчу и декриптовать. Но c моим AES-CBC 256 это оказалось несовместимо, а у меня только вектор поменян и совсем нет конкатенующего паливного хэша. Я щас просто сделаю резку строки и перетасовку - все равно будут долго догадываться и не догадаются скорее всего. Осталось подумать на сколько частей резать и в каком порядке перетасовывать. Кароче вот такое я шифрование придумал. А то эти мужики старые как говно мамонта и код у них такой же дряхлый. |
Кароче вот ... Добавляем порядок с алфавитными индексами на сервере и тасуем. На клиенте делаем 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 этого алгоритма хватит. |
Цитата:
|
Можно как-то так:
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); |
ruslan_mart, неплохо :) я замешал все же на array sort. Только еще добавил римские цифры что парсить не хотели. Думаю еще сделать рандомизацию пути получения капчи по сессии. Тогда точно этого хватит.
А нейронки - да. Но хрумер уже с писькой во рту и этого пока достаточно. |
Часовой пояс GMT +3, время: 18:47. |