> ## Documentation Index
> Fetch the complete documentation index at: https://docs.js-confuser.com/llms.txt
> Use this file to discover all available pages before exploring further.

# String Concealing

> String Concealing involves encoding strings to conceal plain-text values.

* Option name: `"stringConcealing"`

* Option values: `true/false/0-1/Function`

***

### Input / Output

This example showcases how `String Concealing` transforms the code. Try it out by changing the input code and see changes apply in real-time.

```js title="Input.js" lines interactive-mode="obfuscate" theme={null}
// Input.js
var str = 'Hello, World!';
console.log(str);

// Output.js
function v54XVj(v54XVj) {
  var HgGIaL =
      'X8~dI<u}AP,sc@q"|v/{0Uz`C%;BDNHYfljOFg57x3GnLo+6:t&!=y(^)?*eaTZQb]J[4mE9MVrS.w>WhK#_R1ik2$p',
    gIiEFPn = '' + (v54XVj || ''),
    gHP5cR = gIiEFPn.length,
    POexsw9 = [],
    M3tq6Y = 0,
    ea91LI = 0,
    wsl5Pz = -1;
  for (var g2QFidl = 0; g2QFidl < gHP5cR; g2QFidl++) {
    var AD6qI_x = HgGIaL.indexOf(gIiEFPn[g2QFidl]);
    if (AD6qI_x === -1) continue;
    if (wsl5Pz < 0) {
      wsl5Pz = AD6qI_x;
    } else {
      wsl5Pz += AD6qI_x * 91;
      M3tq6Y |= wsl5Pz << ea91LI;
      ea91LI += (wsl5Pz & 8191) > 88 ? 13 : 14;
      do {
        POexsw9.push(M3tq6Y & 0xff);
        M3tq6Y >>= 8;
        ea91LI -= 8;
      } while (ea91LI > 7);
      wsl5Pz = -1;
    }
  }
  if (wsl5Pz > -1) {
    POexsw9.push((M3tq6Y | (wsl5Pz << ea91LI)) & 0xff);
  }
  return XSoR0G(POexsw9);
}
function HgGIaL(HgGIaL) {
  return v54XVj(gIiEFPn[HgGIaL]);
}
var gIiEFPn = [
  'N]I&3hYNs]5v?C4v#0bu',
  '[j|P.&=boeeUpmQGIJF^~rpx/?&hl|d/crAl%',
  'quk=>&n1/(fYE%5YAOzI0_C=u',
  'RYxHuW76v/',
  '#V|P3Q.C~?I~VaA;Fnm}54X',
  '#VH^Nx}{$]^.}7M;5d!M1=U8FP=}cdavfdaNCe>=Ub|d&tc7;]1;}F)=<@',
  'kv>}EF<{fa{g]C5/<Og^GO$NU*s:uKc;+j~',
  '((K(P?6}*]N.e"XCre(V&):b!POW%tbGz0cN4j{88aoV>5)GM`d',
  '{uQP|^;~sZU!RO;G);z.D',
  'fczD6*PKA,rVv<#D]ZVf[jG=o/[h,59YCni}^R~Ejc*',
  'MqpA)EI*B0dM/g;Ngr=w5gkvs]FYUFjHbd@}L(Ji]"i"9;P7g(o^EM*x@U0.X',
  'YdMuIjO6{aVVrKNNw0bV4:#+I',
  't9Bwz?hxja&m9d',
  'FPKu_>c=={A6S;M;fP`lJa^@neU]wF`3@+^(/>Cbu*w/y:XF;rkDdrd38QP48',
  '1D%B`_$8>QyV|9B3"nKuQR$vGvc].9,%}9A(^RJc%0L',
  'ZPdMErz=|Q#<^#@77u5}T!.u6JmU=d',
  'L0c,g4X',
  'Q],B+*g{e]+Yh60D(9O,',
  'YPefp5L/?0;*;g>;ItlB^yxCIP"0n555$:>=*RX',
  'W!3!|9;~&"',
  'MGGM56mN@J2?sqG7tcktAiS?A0"W>EHHe:pfmy+/2]f',
  '7ZJ!*jy3C@rspm95L?w=nEr/&(htfBA',
  '>4c^IrJCx]`WSEU3dcor=ghC.A`0wa4Y_:7((*Q8',
  'z9(}h9K@3Zz*:diOJV$(7OX',
  '8O4&|_T`$0~j7EWBBa*N`m=bfahfOqX/uIUrBO66vJ3CY;GY4!">+*)=P*?',
  'O`o}fe$va)q0c9OYRoryy*ij8J#AheJv,I`PbF(~',
  'D(|PrF76wq3=75dvJYv(0',
  '9P<&!Qu+O(0M>qZN&0AHc&zb)0Z%J%XG*Z=N~KkN70OM|dW;)ed',
  'JZ4N)*u/"cI({#>;g?`IXaxH?vYMCd.%[Z#<yg$8D]>r6dTF',
  'P?#N<:q+[Ph[J*n7/8',
  'G9G!34hjeqfMQq?NUffu7tX',
  '?]e,3S+=#"ldZt_3W]=N/',
  '4GNr**w}R@Y._;[gT92PDxD~8cv#cds',
  'e:5Y:txxdP@WDB!30?^."9n6o/e',
  'g9T,!Sd{#{VDX"G%_Gt(XaRrEb%vTI',
  'h%xV[Z4+pZJD}5HCSX',
  '.sc,1o1Ou',
  '0chuEm+/XQ&Vj%evdId',
  'koOr+TNNV0EEwIZv9:OMVmAbg@{M3@@7/+i=645C.A=DR9M{|+J<',
  '}4&!C5&~Oaae7;=D',
  '6Yz.TaJh]"SrY~v;Wo+=uFXE,0!hOdX`2dK(%>!{(b*h_O<%I4FN765*E{Zt8',
  '27awoQZc/Q<]UMjvOu_y>&IG#PLq?|D`7N^.GOeO{c3VJ5u5(xP>B(X',
  'aPnfkoD=[(.fn5zD[Vc,0_@@x@:tM9L{?:>P(QPyYU#%l:$NaP8H[jP8',
  '4:xB{9<mKPs,0dg{X+dMIyw@tcGOe*S;q"PHz',
  'B"_Aay*/I{zY]aE5ie_A',
  ':(8MrK$W0(mJHtn5E]zVmr_@K(mVR:*Dgrq}xQ}3%ZPSIaYv.o~',
  '%P}=`=X',
  '^Z"Hp.#j]cprE5dg',
  '+Y_y9Kfi{?tY*%txqPo}t!V3@U3vqg8YMX',
  'MYb(;_s8',
  '446(A^=x0?PB8',
  'G!xSh5v%8J6YI_q',
  '/PrfC6ECW/MEX"Tv4`[fx6IG&P!YA7c',
  '=`~B,F1NM]nha_UO2G+I@mZ/I?5ZwM0jr]ew_odk`@!YY#2zc8',
  'b!fV^#t}(@lWtM4H?o~',
  'RqeN&El?ZA!QtMbHXc.<54R=p0krAMn;tnJAum?1vP~6+t8g',
  'IQ|(B_X',
  '$7&AAid%B0y=8FInH?=}[r%}Ss$%yI4Y#V:Pdjg?tJ]E8',
  ')9"(XiE=;]oZnEG%"u9I6*9}&"gds5i3C8',
  'U!:u,5F=$qN00Bm%Ur~',
  'hg[wpeXAoAWKg|QvbP{N()@3{?Tq)d(3z!d',
  'ogq=Yeo85{w)t|*3+;Gf~ro6<@C.T:A;.)A(qZl{os',
  'ydlul4A=Kc`^wIi|',
  'ZViY}^CA4?_&TCi|5u7.8FCF&aE/g:G5}8',
  'E:GB.^a+TADWj%2OzaEt}av%V*|C8',
  'VsGBq&qA|J9w2FT`UrxH_5P8',
  '}4TYqmg}>/LmX|EYnYS<q.3}sZ|#5T]FQD]u',
  'cIAl"Zy3la]88:2DYc>90=zr{{gDABs;z(:u',
  'v!5ID6K1)*!}qTt7RYU^hKx+4{fq%|8`^upf%>]84{[w5tHH_X',
  '6cNr>?~H~Q.Q.9WBkjh(d^?8',
  'IQK(|.]On)CZ}#NvT42Ph^^}u@^Q7*DFmP^=VF^3!c?',
  '|fI&^Q)+vcBv8',
  'h0tBV^ic.q@HBq=DM:0^|^LC8PiEF:(DU4FY4Fhu:?|C]IFY#jd',
  '&9HV*Mp=+U(/4Ba`IP#!XF1OoUmy5%yx"g.w4j`}~QmEnEn5n]Sra!S?u',
  '?4!rSrTO&(>A?Cm%/;%B5t!OGZYW}d4%#j,BA&O@fP',
  '#03(YeX',
  'p]IYc.,=I((qU:3YJD{N0_Lh8?.h8',
  'FdsMPZo{H"m"6#V%<O~',
  '|x:uE&"Kv?:m`9_Bt9D^rKm3E@.h||5C`0K!Y1f=AvMhhCS%1jbtZyX',
  'Ss4yH1N3)*)Ex9@Bbe8B$?M/]a]JPaB3%x@,',
  't09D@_*+Le*fU:]g&;Ku`&xh{?/!D_q',
  '2:b(yR78l/#w[*f`/;^V7VH/S]9Q@MQg<aiVf6@6^0/:_~@',
  '>Z0N:!c/FPR&";ZOkEd',
  '4`&fz=k3O(#y!*^3[jIry))=q/jmX',
  'hu^P^R6}oU',
  '3:UIDOpZV]5Jm:~g0NtuPi93%ZA|DB8nvQR&ntX',
  '%+srCe1N@e"M^eE5We9VzmX',
  '/!)Vw&pCBevCc"R3Pf|>vZ}yC@:t[qlHv"9Dq',
  'Zx^V)al3.A/mO9YHfccNEyX',
  '=((DsKO?u*nmS5ZG}9.9h.gQy{qg^#g{V)>I347}vP4VhFL7vc9=%',
  'AfdN#oM/30(.8',
  'l`g^;.z~XPO,Y~c%Mdd',
  '|9>ty!XCOcx=c"!3O`5=U9D~eqmafB;GC()urmQN5*)V3@W;z8',
  'H(&BJ:B}XU',
  'v;bt$VDA)*:mj~%D|avB]+B}ae~SwMAYZ:EYU?|EI',
  'IJXB9W<@Ty5.f|V%Z]4^Pa*/zbwA@R"Bsn+}mrXFcqH,I"HHQ4~',
  'ZZAScm.uB07V)_E/hsm^xQrC[{L,(@G;EVE97tp=xvwrwKbC!u~',
  'N9nwZa}@YJOU(%s%IQcN0',
  '/;5}z.xhLqPH<F}/3x+=GEh+d(qg8',
  'u;mrv?:*Y/c04_Rzqa&BI:WNsZ(',
  'C4ABsig?(*VALBkxl?AS#K,/&(A!/<l`Z0/!e+S8',
  '?j[NI:ZCrZ=/"&QGS0EYn!z=0b%^i%wB;g~',
  'hsMPY>iZ/(+.IBrY^P>Dp1q~[c_[:IgYbv=N{m;H_c',
  'F`u}*EV?9*waNMG59!o.cmhrW"=)29eG@x<&ur(=avCWq&bGsQ7u',
  '?([y1=(hS]H,:djC}t&BVZe@cZ+mWe2jUN=N`=o@G]$Ng:<%E:%H"K]82v',
  '@a@,Ux]Ng{SE/5S%Vv!fk5Mu70KtIB^3P+zY;xJH:Q$K4B7%Zd~',
  '>u<}D1;ACvm)Id',
  'd?g^J:jFXJRc8|uCzP9=[jv6~{zWiK75]x.wx4^}}',
  '^9ey{m)~90|!&TZGu95Y`6/*p0]E|FZGPN7IB>FcLeP48TTNg!grS^!1es',
  'utI^b*rcja}TJgI/wYL,M.pC4P',
  '^v%(/K>*i@5V&g(xXObV%?$vYcaJ/T,5M0m9ay.cs0',
  'B`6=.^*H7*Ttf6n%mD}lQr^6.vd(NI',
  '>q:Pl>2X|SnhhCW<',
  'OnAP',
];
function gHP5cR() {
  var v54XVj = [
      function () {
        return globalThis;
      },
      function () {
        return global;
      },
      function () {
        return window;
      },
      function () {
        return new Function('return this')();
      },
    ],
    HgGIaL,
    gIiEFPn = [];
  try {
    HgGIaL = Object;
    gIiEFPn.push(''.__proto__.constructor.name);
  } catch (e) {}
  _94Rkgn: for (var gHP5cR = 0; gHP5cR < v54XVj.length; gHP5cR++)
    try {
      HgGIaL = v54XVj[gHP5cR]();
      for (var POexsw9 = 0; POexsw9 < gIiEFPn.length; POexsw9++)
        if (typeof HgGIaL[gIiEFPn[POexsw9]] === 'undefined') continue _94Rkgn;
      return HgGIaL;
    } catch (e) {}
  return HgGIaL || this;
}
var POexsw9 = gHP5cR() || {},
  M3tq6Y = POexsw9.TextDecoder,
  ea91LI = POexsw9.Uint8Array,
  wsl5Pz = POexsw9.Buffer,
  g2QFidl = POexsw9.String || String,
  AD6qI_x = POexsw9.Array || Array,
  Rsjcheq = (function () {
    var v54XVj = new AD6qI_x(128),
      HgGIaL = g2QFidl.fromCodePoint || g2QFidl.fromCharCode,
      gIiEFPn = [];
    return function (gHP5cR) {
      var POexsw9,
        M3tq6Y,
        ea91LI = gHP5cR.length;
      gIiEFPn.length = 0;
      for (var wsl5Pz = 0; wsl5Pz < ea91LI; ) {
        M3tq6Y = gHP5cR[wsl5Pz++];
        M3tq6Y <= 0x7f
          ? (POexsw9 = M3tq6Y)
          : M3tq6Y <= 0xdf
            ? (POexsw9 = ((M3tq6Y & 0x1f) << 6) | (gHP5cR[wsl5Pz++] & 0x3f))
            : M3tq6Y <= 0xef
              ? (POexsw9 =
                  ((M3tq6Y & 0x0f) << 12) |
                  ((gHP5cR[wsl5Pz++] & 0x3f) << 6) |
                  (gHP5cR[wsl5Pz++] & 0x3f))
              : g2QFidl.fromCodePoint
                ? (POexsw9 =
                    ((M3tq6Y & 0x07) << 18) |
                    ((gHP5cR[wsl5Pz++] & 0x3f) << 12) |
                    ((gHP5cR[wsl5Pz++] & 0x3f) << 6) |
                    (gHP5cR[wsl5Pz++] & 0x3f))
                : ((POexsw9 = 63), (wsl5Pz += 3));
        gIiEFPn.push(v54XVj[POexsw9] || (v54XVj[POexsw9] = HgGIaL(POexsw9)));
      }
      return gIiEFPn.join('');
    };
  })();
function XSoR0G(v54XVj) {
  return typeof M3tq6Y !== 'undefined' && M3tq6Y
    ? new M3tq6Y().decode(new ea91LI(v54XVj))
    : typeof wsl5Pz !== 'undefined' && wsl5Pz
      ? wsl5Pz.from(v54XVj).toString('utf-8')
      : Rsjcheq(v54XVj);
}
var bNJoF4R = HgGIaL(112);
console[HgGIaL(113)](bNJoF4R);
```

***

#### Custom String Encodings

[Custom String Encodings](./customStringEncodings) allows you to define your own string encoding/decoding functions.

***

### Custom Implementation

#### `options.stringConcealing(strValue)`

Control which strings are changed. Returns a `boolean`.

| Parameter  | Type     | Description                          |
| ---------- | -------- | ------------------------------------ |
| `strValue` | `string` | The string proposed to be encrypted. |

```js title="Options.js" lines theme={null}

module.exports = {
  target: "node",

  // Custom String Concealing
  // Always encrypt API endpoints
  stringConcealing: (str) => {
    if (str.includes("https://api-example.com/")) {
      return true;
    }

    // 60% for other strings
    return Math.random() < 0.6;
  },
};
```

***

### Usage Example

The provided code example will obfuscate the file `input.js` and write the output to a file named `output.js`.

```js title="Usage Example" lines theme={null}
import JSConfuser from "js-confuser";
import {readFileSync, writeFileSync} from "fs";

// Read input code
const sourceCode = readFileSync("input.js", "utf8");
const options = {
  target: 'browser',
  stringConcealing: true,
};

JSConfuser.obfuscate(sourceCode, options).then((result)=>{
  // Write output code
  writeFileSync("output.js", result.code);
}).catch(err=>{
  // Error occurred
  console.error(err);  
});
```

***

#### Enabled In

* [High Preset](/presets/high): Yes
* [Medium Preset](/presets/medium): Yes
* [Low Preset](/presets/low): Yes
