feat: Improved data obfuscation
This commit is contained in:
parent
5b01a34c78
commit
abb296ac11
3 changed files with 98 additions and 5 deletions
|
|
@ -620,30 +620,49 @@
|
|||
<!-- </ol>-->
|
||||
</footer>
|
||||
<script>
|
||||
import ('/src/lib/crypto.js').then(module => {
|
||||
window.decode = module.decode;
|
||||
});
|
||||
|
||||
function reveal() {
|
||||
const locationHref = atob("aHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvcmVsYXRpb24vMTMzNTEwMA==");
|
||||
const locationText = atob("TG9jaHJpc3RpIDkwODAsIEJlbGdp6w==");
|
||||
const locationHrefCode = "NHtnf0QfKwd3KAFJD2BSJiAaIydZXStKIwZgGAYKDBg5Pk9RJiJMXC0yIR8KBhUwAncSFmsGbxMHBg4eHx8aXXhUPwZoYxNeFXM1EgRPclg2DTkFIClMXQsIA2Yee3ptOAxPBgEtWwYVLClddjE5Gwp4A1N1fQc/Oy4mTWQdECYyOBx/GHVzKl8/HgVoFVo6aW0ILAR0X0sCHAIkby0kDW4zImYDVlMSDH4uOj4ROHwVfwo/EWFwIjwNMlxvEzUvBCoWBXUaeXttLlU6Kw1DAyI/AgBkHRoXHTlVMntZdgtYTksHbXVSAj8PFgpNMSs4TGIkQ2AgFRxqP3soMBgkMU4ySXhZV0JJYVdrK2FtSWpYelI1WWs0dldtQWxmblVrS1hOSWF6MDVNMTQvZUdWSFZUMW5ZWEkvYzMxU2FGQXNQbHB0WmwxK2NVbFJjaTFnZTBoRlFnPT0=";
|
||||
const locationHrefMask = "VTM1TydXZjE7UTh6a1MxU0IpYUs7M2V6QGs2dGJNPXBafXonRU8vKk5fd2xTXkdAYEUmYCZSImlJUktpUltPay0uU08xUSMnWyZdV04hPDJsYUldcUUjMl1yQSV6LUtVaU92VVhXY3Fwb2c6Jl9sYltKVis7TkZXXUBCJTAtc01qe3NJSjY1Wz1nckMwbG5DMDhnVVY3L35ndmZqI0dhdD9Ze1VaZDA9QCtNQGlESD9COG5pSDlBel9nSiw6VHtuYVBAQixfSCE1aWB5Zls0M2xSM2MudGJneWo9UDdoTjw9fX5jJzExLWVKfnMuckRNLzFXKS13fXsnfDFgaXNiRg==";
|
||||
const locationHref = decode(locationHrefCode, locationHrefMask, 46);
|
||||
|
||||
const locationTextCode = "bQIeUgAlaTBEXGkafD1MNz8wDDNraHRQJyFcKC4dWUYWHBYaOCsqDGoiB1BBKjQkFyovTggUHEAtAhhPC2Z7fCRGWjENOnEbFx86ATA9Iy0BewIFclJCBgM4fFs+BG81AQUgHBh3WCMKJQQ8ATgTUHhfcyEmE2x9XFBtD3IsIBc5HzMZdRMCBHM7dy0WEzwjEhVQbRFle0Z8YUl7EhUWLmUELhl6KGBpKARFBQMtJwwbPl11KHgNKUgRPwcNW3cdIhMjAwARKUU1S1dHKRY4c3NyRXIEP0pbaFYhXDgKAEYlLik7GgRScjpPDS0yNgsEBSRzADI1HDBiRA4xAicQAlZGMUpNVzlzSjFJa1pHaFBYalZnUUd0TVRFMDNha0VoTkdVaVdYMVVUM0JWV0Y1Zk0xMUtRUzVvSjJwN01ERW9NVXdyU1hSZlczSkJXRHcvYVdKUmZRPT0=";
|
||||
const locationTextMask = "OUUnOGFtI0AnbztqNXknQHB0TUAiLT48RWY4WEpKaStaWideYFFCSzlxMnsnYlNXdG1iOF15dCF7bEklX1dOLEV1bltUbidUXi5wc1JWcUxXIzNJJjwqT1pCMmtkNVZUU1NlLUgjYFBbT2B+ZVMiIjMxJVNwSy4nPWA/bSR0UGBtdlxrOSJMRiJ+Tl9YV0xEcyQ0NUk2SjMqUXgxWydyRT1Qdy0wfVVZeUdwN2ZBZT1NeDlFSy88YS59aWhcNyEsQ2pPbkojUXV7MTg1eGxXWCM1IkdUeiVuOThvNlpCaC9peEFKT1NjKHV9QFR7WG9QU2dLempeXUg0L3ZmYE5aVA==";
|
||||
const locationText = decode(locationTextCode, locationTextMask, 23);
|
||||
|
||||
const locationLink = document.querySelector('#location');
|
||||
if (locationLink) {
|
||||
locationLink.href = locationHref;
|
||||
locationLink.textContent = locationText;
|
||||
}
|
||||
|
||||
const birthYear = atob("MjAwMw==");
|
||||
const birthYearCode = "ezEuMW59TwYcFw5APH50EiltRxYsJT0uKWMKYWciDAMbPQQ6EzVnMWEvOCUvBDohPxYwPQJmMDMiHTB6CmMFDiRjUV5pFDYFGyZ2DAdrHW4uEU1PfQBAD2QYXGQDcU0nOUchBxdrEhVVHy8MZEEqVCItJQ0wcRFCMitpGmsIeBtrPC4qL08eFGFkFENEei4gRi8lDXxnWRICegYiCRdRQX4yByoyMXlzNHExcCMlSgsJNQNiYEEbbiEZQhYeCHMsYhUbDmIMRXAIcCp0KRxmPi54EF5vPQc8BjAKXhMnJB82FUYACTUnUyM3EwwWQ3EJHRMLb2B6FhhvRhsaTSgFCFNTczZYWFZ0ZFVwRmNqVlFSMEloTG50bFpXMTJVWGNqTkRrd09GcFRaVmg3S0h3cFNHeFBYRFI5VWw5TVBTOHZjVDEwUUNkcktHWnBibmQwWUNabUxRPT0=";
|
||||
const birthYearMask = "NltvRiNNI1VQQV93bysme3NeI3NhfUlZSDdMKjF2QnVCREpscU81Ui5Fdld2N2hIblJ6TktWfndARWVJRitmOUY0aWk/UlFyT1xHR1YuSydNWTolK0Y4WDZiaVVUQipUcyxFXkMtUCYzWn54PnFZIXZ6b0BpMml0ZmM4aDNMTHYiaFZgeCIreC88cHMlSHhIJEVWNCs/IUFjS2pzQiZlMSlIM1N+SDRcfkN7NHpcc3haXlk7MSpROkJcIWRGTj1LO3lefjFZNUJqJ2g5Zy0jRmM9ZG0/REl5ZUp9K3JiSEd4Rnd2QkxUK2hhRTVfLkl8fiFdPDMyel4iLGwpLHtfUg==";
|
||||
const birthYear = decode(birthYearCode, birthYearMask, 4);
|
||||
|
||||
const birthdayElement = document.querySelector('#birthday');
|
||||
if (birthdayElement) {
|
||||
birthdayElement.textContent = birthYear;
|
||||
birthdayElement.setAttribute('datetime', birthYear);
|
||||
}
|
||||
|
||||
const emailAddress = atob("dGlib0BkZXBldXRlci5kZXY=");
|
||||
const emailAddressCode = "KCsbPg5XalgSGDcbHiAuG11HB0QfOWREMnljRwZgFSMPE1oaXX4QCisbRB8iICYZcyM3DQUkKjEoKyYyGiErBW5VVX4CVhwjbBkgBQkqPlppYAlZZg8+FTQ8HmtRECc1Pw1jMHRxJRYGDk0fZBx8LVVZP3UnOCRZB21iWl86DF1wfA00UhINagcschc4Cgk0ESAMEDV5aGZaTlQnfgJhMmkvcD9Rc2IcNksHCREwCEtEVhJGfWtsQnJOQwwRBE0RPj9vZxwXYD4KETpZGR9HVjsREg4pAGA5PEEhfQk3EStmPQgQDjJ+KXVsPz0rG0JeYysAXCgJfGNvUVxKM1YgS2ZuQWhNMGx2V0VwY0xHTjRmRGRzUW5OQlNFOTROanRkZGx0elBTOGtMbUJLVmtzb0lUQmRXSGR6ZkRkb1IxMWtQaThsZUdzbGNXNHJQRzVMT1U0dE5RPT0=";
|
||||
const emailAddressMask = "TGx3V2xnKDNIQHV3enh8dz4uMi9FYT58ZEsldkhSR2RYVSpDOz0pRnMpcVRoTXdrOHdPRFZPZFt7RUJGQnJyMDplMk9LZHBXO09tc1lscDUmNk8vL1xOUHppVC00fU92dnc2SC4nVX5XWilUKFglXTcydSZpfU80Yj43aTxUOTg/KUBaN0d1W0tAR0dicE99cGZOZ1c/WVE/NG1zJ24sQSZnOUw3NjMrfXlvMV53SSYhP1dwLCxVOzgkK3pYNClYa3tfUkhANU9AR1EwTHJ+ZHBUIzlPVDZPbS9ZL1N0W00seEJkWnYwWDw5R298cHdsKHNVNn1wTFU4OG0tZzxHeQ==";
|
||||
const emailAddress = decode(emailAddressCode, emailAddressMask, 17);
|
||||
|
||||
const emailElement = document.querySelector('#email');
|
||||
if (emailElement) {
|
||||
emailElement.href = `mailto:${emailAddress}`;
|
||||
emailElement.textContent = emailAddress;
|
||||
}
|
||||
|
||||
const phoneNumber = atob("KzMyNDg3NjU2OTc1");
|
||||
const phoneNumberCode = "IigvOgkNQx4hUDBVIRIsRgA9OgtrfR5HDDILNGNkEh9oGWRaGFpeMUADVksueTcVWwNgOxYmOio3FH07JypgGyd0LShDCnAFHlNbUSRcDmkuUU4HcQk2bwdAfR5sCwgrZGYScycJYGINDgp/ZSYuGhhFLF18MGZcKDlgGyMcZxkgIiNjezsJIAJCNFF/Mxg6CFwuaHoEVh8gAW8xdGcwdAlEJlctDykTYzkxB3V6KxMcYltkAHokDDkwRl4pQGUFHSJ1cztNLhUeEz8MCk8PEA0UTFA7NWssCVILcRMgR3UtOCM0B2NeTRZiEDZ0AT4DNU4lXCxaKQ0PZxgKLhE4WlgyRW5MSGd6UFhKNVNVNDhNVEZyV3lsZlQweE5KaWs4VlQxZUxXWmpNVVFyYkRGM0lVVjBSRHcyYkRnMFNYNTBPMTlnUFZoWFAzeFVmSGxPYmxaMVl3PT0=";
|
||||
const phoneNumberMask = "aVJiQ0dJJC1vOmVnbkZPd0poVk84Tk9+amVnbTkwW2slXS4qU2omdSVQJT57SkMnPWlZTkxIeHt5UkhMdkYyWGtFXkEncDI0SmI3YUBtRCZPYCk0KEF7REwuSFomYmRSLyJAKkNkKVBURj87K0pefFIvW2UvXTAyTm8iS2lLVmpwS1RRIXM4elsodT41d2BpRzBnUSs1Oi1FVD1lOFdmIVwpZCdPYl11KUNnVTkpR0JMJ243TS5mY3RdKSlIcydkSkwvMHF+XXx8RHl8R302aFVDI2dpTyl1RitBNl5MIzl+bHFVTCRrKnc1QUA/VGQoejRGM31qeGNuL2h+Z0l6Yw==";
|
||||
const phoneNumber = decode(phoneNumberCode, phoneNumberMask, 12);
|
||||
|
||||
const phoneElement = document.querySelector('#phone');
|
||||
if (phoneElement) {
|
||||
phoneElement.href = `tel:${phoneNumber}`;
|
||||
|
|
|
|||
49
src/lib/crypto.js
Normal file
49
src/lib/crypto.js
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
function generateRandomCharacters(length) {
|
||||
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' +
|
||||
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'; // All printable characters
|
||||
let result = '';
|
||||
|
||||
for (let i = 0; i < length; i++) {
|
||||
const randomIndex = Math.floor(Math.random() * characters.length);
|
||||
result += characters[randomIndex];
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export function encode(input, paddedInputLength=256) {
|
||||
const paddedInput = input + generateRandomCharacters(paddedInputLength - input.length);
|
||||
const encoded = btoa(paddedInput);
|
||||
|
||||
const mask = generateRandomCharacters(paddedInputLength);
|
||||
|
||||
// Take the XOR of encoded and mask
|
||||
let maskedEncoded = '';
|
||||
for (let i = 0; i < encoded.length; i++) {
|
||||
const charCodeEncoded = encoded.charCodeAt(i);
|
||||
const charCodeMask = mask.charCodeAt(i);
|
||||
const maskedCharCode = charCodeEncoded ^ charCodeMask;
|
||||
maskedEncoded += String.fromCharCode(maskedCharCode);
|
||||
}
|
||||
|
||||
const maskEncoded = btoa(mask);
|
||||
const finalEncoded = btoa(maskedEncoded);
|
||||
|
||||
return [finalEncoded, maskEncoded];
|
||||
}
|
||||
|
||||
export function decode(finalEncoded, maskEncoded, length) {
|
||||
const mask = atob(maskEncoded);
|
||||
const maskedEncoded = atob(finalEncoded);
|
||||
|
||||
let encoded = '';
|
||||
for (let i = 0; i < maskedEncoded.length; i++) {
|
||||
const charCodeMasked = maskedEncoded.charCodeAt(i);
|
||||
const charCodeMask = mask.charCodeAt(i);
|
||||
const originalCharCode = charCodeMasked ^ charCodeMask;
|
||||
encoded += String.fromCharCode(originalCharCode);
|
||||
}
|
||||
|
||||
const paddedInput = atob(encoded);
|
||||
return paddedInput.slice(0, length);
|
||||
}
|
||||
25
src/obfuscator.js
Normal file
25
src/obfuscator.js
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import assert from 'assert';
|
||||
import { encode, decode } from './lib/crypto.js';
|
||||
|
||||
const inputs = [];
|
||||
process.stdin.on('data', (data) => {
|
||||
const userInput = data.toString().trim();
|
||||
|
||||
if (userInput.length === 0) {
|
||||
inputs.forEach(input => {
|
||||
const [encoded, mask] = encode(input);
|
||||
|
||||
assert(decode(encoded, mask, input.length) === input, 'Decoded value does not match original input');
|
||||
|
||||
console.log(`Input: ${input}`);
|
||||
console.log(`Encoded: ${encoded}`);
|
||||
console.log(`Mask: ${mask}`);
|
||||
console.log(`Length: ${input.length}`);
|
||||
});
|
||||
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
inputs.push(userInput);
|
||||
console.log(inputs);
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue