Можно примитивно XOR'ить «секретный» пароль и строку. Очень ненадёжно, как и вся затея с хранением ключа шифрования в клиентском скрипте. Тем не менее, вот пример. При смене хэша он заменяется на шифрованную строку. начинающуюся с восклицательного знака - отличительный признак. Если так же вставить хэш с воскл. знаком - он дешифруется и заменится исходной строкой:
((w) => {
function superpooper(secret) {
const pass = encodeURIComponent(secret);
return function onHashChange(){
var hash = w.location.hash.replace(/^#/,"");
if (!hash.length) return;
const xor = s => s.split('').map((c,i)=>String.fromCharCode(c.charCodeAt(0)^pass.charCodeAt(i%pass.length))).join('');
if (hash[0]==='!') {
hash = hash.substring(1);
const decoded = decodeURIComponent(xor(atob(hash)));
history.replaceState(null, null, document.location.pathname + '#' + decoded);
} else {
const encoded = btoa(xor(encodeURIComponent(hash)));
history.replaceState(null, null, document.location.pathname + '#!' + encoded);
}
}
}
w.addEventListener("hashchange", superpooper("abrakadabra"), false);
})(window)
Если запустить через консоль и в текущей вкладке добавить, например, хэш
#Моё секретное сообщение
оно тут же заменяется на
!RFBHJVtEVlRbMURTVzZRTlNRIydXU1QmQ0RZVF1QR0BUU1JXU14lVURQR1lQR0BUL1FBU1cwVERQRyVbRFZUIDNEU1c2UE5TUVlSV1NUJkJEWVQmVEdAVCVTV1NeWVZEUEclUUdAVCklQVNXNlFEUEcjLkRWVCZCRFNXMFROU1FTUldTVCZDRFlUXFBHQFQlUldTXiMhRFBHJVFHQFQpJEFTVzZRRFBHI1pEVlQmQ0RTV0pYTlNRJVJXU1QgR0RZVCBRR0BUIyZXU14lVERQRyNZR0BUL1FBU1cwVA==
И наоборот, если в странице добавить этот длинный хэш, он заменится на «Моё секретное вот это вот всё».
Ключ шифрования тут
abrakadabra
Увеличение длины получается из-за того, что прогоняю через
encodeURIComponent()
, чтобы нормально работало с кириллицей, смайликами и emoji.
Исходный пример это простой binhexу вас похоже на binhex: btoa('youtext') // "eW91dGV4dA=="
– тут никаких ключей не требуется.
atob("eW91dGV4dA==") // "youtext"