Welcome to WebmasterWorld Guest from 3.92.28.84

Forum Moderators: open

base 64 decode in Javascript

any foreseeable problems with this code?

     
6:57 am on Sep 4, 2018 (gmt 0)

Senior Member

WebmasterWorld Senior Member 5+ Year Member Top Contributors Of The Month

joined:Mar 15, 2013
posts: 1116
votes: 109


I've been encoding with this PHP script for several years:

$encoded = rtrim(strtr(base64_encode($unencoded_string), '+/=', '-_,'), ',');


This doesn't really encode anything important, I just use it to comply with Google's PII policy by hiding email addresses in the URL. So security really isn't an issue.

But now I would like to decode it via Javascript, which will allow me to hide some other things from bots. After doing some research, this seems to be working:

var = [encoded_string];

// borrowed from
// https://scotch.io/tutorials/how-to-encode-and-decode-strings-with-base64-in-javascript
var Base64 = {
_keyStr:'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
encode:function(e) {
var t = '';
var n,r,i,s,o,u,a;
var f = 0;

e = Base64._utf8_encode(e);

while (f < e.length) {
n = e.charCodeAt(f++);
r = e.charCodeAt(f++);
i = e.charCodeAt(f++);
s = n>>2;
o = (n&3)<<4|r>>4;
u = (r&15)<<2|i>>6;
a = i&63;

if (isNaN(r)) { u = a = 64 }
else if (isNaN(i)) { a = 64 }

t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
}
return t
},
decode:function(e) {
var t = '';
var n,r,i;
var s,o,u,a;
var f = 0;
e = e.replace(/[^A-Za-z0-9+/=]/g, '');

while (f < e.length) {
s = this._keyStr.indexOf(e.charAt(f++));
o = this._keyStr.indexOf(e.charAt(f++));
u = this._keyStr.indexOf(e.charAt(f++));
a = this._keyStr.indexOf(e.charAt(f++));
n = s<<2|o>>4;
r = (o&15)<<4|u>>2;
i = (u&3)<<6|a;
t = t + String.fromCharCode(n);

if (u != 64) { t = t + String.fromCharCode(r) }
if (a != 64) { t = t + String.fromCharCode(i) }
}

t = Base64._utf8_decode(t);

return t
},
_utf8_encode:function(e) {
e = e.replace(/rn/g, 'n');

var t = '';

for(var n = 0; n < e.length; n++) {
var r = e.charCodeAt(n);

if (r < 128) { t += String.fromCharCode(r) }
else if (r > 127 && r < 2048) {
t += String.fromCharCode(r>>6|192);
t += String.fromCharCode(r&63|128)
}
else {
t += String.fromCharCode(r>>12|224);
t += String.fromCharCode(r>>6&63|128);
t += String.fromCharCode(r&63|128)
}
}
return t
},
_utf8_decode:function(e) {
var t = '';
var n = 0;
var r = c1 = c2 = 0;

while (n < e.length) {
r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r);
n++
}
else if (r > 191 && r < 224){
c2 = e.charCodeAt(n+1);
t += String.fromCharCode((r&31)<<6|c2&63);
n += 2
}
else {
c2 = e.charCodeAt(n+1);
c3 = e.charCodeAt(n+2);
t += String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);
n += 3
}
}
return t
}
}

// reverse the transliteration
encoded = encoded.replace(/-/, '+');
encoded = encoded.replace(/_/, '/');
encoded = encoded.replace(/,/, '=');

var decoded = Base64.decode(encoded);


Do you guys see any problems with using this? If so, is there a better / easier / faster way to encode in PHP and decode in Javascript?
9:38 pm on Mar 27, 2019 (gmt 0)

New User

joined:Mar 27, 2019
posts:1
votes: 1


Use atob [developer.mozilla.org].
2:02 am on Mar 28, 2019 (gmt 0)

Senior Member

WebmasterWorld Senior Member Top Contributors Of The Month

joined:Apr 1, 2016
posts:2620
votes: 770


@distortum Welcome to Webmaster World