[{"data":1,"prerenderedAt":2398},["ShallowReactive",2],{"guide-base64-vs-encryption":3},{"id":4,"title":5,"body":6,"date":2390,"description":2391,"extension":2392,"meta":2393,"navigation":224,"path":2394,"readingTime":250,"seo":2395,"stem":2396,"__hash__":2397},"guides\u002Fguides\u002Fbase64-vs-encryption.md","Base64 Encoding vs Encryption: Why They're Not the Same",{"type":7,"value":8,"toc":2358},"minimark",[9,14,18,21,25,30,119,123,134,138,145,149,261,265,272,285,291,302,306,310,393,396,854,858,861,906,910,917,931,934,938,942,1063,1067,1114,1118,1190,1194,1197,1201,1206,1234,1239,1300,1305,1331,1336,1376,1380,1384,1387,1514,1519,1540,1544,1547,1945,1949,1952,2184,2188,2278,2281,2285,2288,2307,2316,2319,2333,2337,2354],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17],"p",{},"One of the most common misconceptions in software development is that Base64 encoding provides security. You have probably seen code where someone \"encrypts\" a password or API key with Base64 and believes it is now safe from prying eyes.",[15,19,20],{},"This confusion can lead to serious security vulnerabilities. This guide clearly explains the difference between encoding, encryption, and hashing — and why you must never use Base64 as a security mechanism.",[10,22,24],{"id":23},"the-fundamental-difference","The Fundamental Difference",[26,27,29],"h3",{"id":28},"base64-is-encoding-not-encryption","Base64 is Encoding, Not Encryption",[31,32,33,49],"table",{},[34,35,36],"thead",{},[37,38,39,43,46],"tr",{},[40,41,42],"th",{},"Aspect",[40,44,45],{},"Base64 Encoding",[40,47,48],{},"Encryption",[50,51,52,67,80,93,106],"tbody",{},[37,53,54,61,64],{},[55,56,57],"td",{},[58,59,60],"strong",{},"Purpose",[55,62,63],{},"Data representation (binary → text)",[55,65,66],{},"Data confidentiality (readable → unreadable)",[37,68,69,74,77],{},[55,70,71],{},[58,72,73],{},"Key Required",[55,75,76],{},"No",[55,78,79],{},"Yes (symmetric or asymmetric)",[37,81,82,87,90],{},[55,83,84],{},[58,85,86],{},"Reversible",[55,88,89],{},"Yes, by anyone",[55,91,92],{},"Yes, only with the correct key",[37,94,95,100,103],{},[55,96,97],{},[58,98,99],{},"Security",[55,101,102],{},"None",[55,104,105],{},"Designed for security",[37,107,108,113,116],{},[55,109,110],{},[58,111,112],{},"Example Use",[55,114,115],{},"Embedding images, JWT payloads",[55,117,118],{},"Protecting passwords, API keys",[26,120,122],{"id":121},"visual-explanation","Visual Explanation",[124,125,130],"pre",{"className":126,"code":128,"language":129},[127],"language-text","Base64 Encoding:\nPlain Text:  \"Hello\"\nBase64:      \"SGVsbG8=\"\nDecoded:     \"Hello\"  ← Anyone can decode this!\n\nEncryption (AES-256):\nPlain Text:  \"Hello\"\nEncrypted:   \"a7f3b2c1d4e5...\" (ciphertext)\nDecrypted:   \"Hello\"  ← Only with the correct key\n","text",[131,132,128],"code",{"__ignoreMap":133},"",[10,135,137],{"id":136},"what-base64-actually-does","What Base64 Actually Does",[15,139,140,141,144],{},"Base64 is a ",[58,142,143],{},"binary-to-text encoding scheme",". Its only purpose is to represent binary data using ASCII characters that are safe for text-based protocols.",[26,146,148],{"id":147},"how-base64-works-simplified","How Base64 Works (Simplified)",[124,150,154],{"className":151,"code":152,"language":153,"meta":133,"style":133},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F Base64 converts binary data to printable characters\nconst text = \"SecretPassword123\";\nconst base64 = btoa(text);\nconsole.log(base64); \u002F\u002F U2VjcmV0UGFzc3dvcmQxMjM=\n\n\u002F\u002F ANYONE can decode it just as easily\nconst decoded = atob(base64);\nconsole.log(decoded); \u002F\u002F \"SecretPassword123\" ← No security!\n","javascript",[131,155,156,165,187,204,219,226,232,248],{"__ignoreMap":133},[157,158,161],"span",{"class":159,"line":160},"line",1,[157,162,164],{"class":163},"sJ8bj","\u002F\u002F Base64 converts binary data to printable characters\n",[157,166,168,172,176,179,183],{"class":159,"line":167},2,[157,169,171],{"class":170},"szBVR","const",[157,173,175],{"class":174},"sj4cs"," text",[157,177,178],{"class":170}," =",[157,180,182],{"class":181},"sZZnC"," \"SecretPassword123\"",[157,184,186],{"class":185},"sVt8B",";\n",[157,188,190,192,195,197,201],{"class":159,"line":189},3,[157,191,171],{"class":170},[157,193,194],{"class":174}," base64",[157,196,178],{"class":170},[157,198,200],{"class":199},"sScJk"," btoa",[157,202,203],{"class":185},"(text);\n",[157,205,207,210,213,216],{"class":159,"line":206},4,[157,208,209],{"class":185},"console.",[157,211,212],{"class":199},"log",[157,214,215],{"class":185},"(base64); ",[157,217,218],{"class":163},"\u002F\u002F U2VjcmV0UGFzc3dvcmQxMjM=\n",[157,220,222],{"class":159,"line":221},5,[157,223,225],{"emptyLinePlaceholder":224},true,"\n",[157,227,229],{"class":159,"line":228},6,[157,230,231],{"class":163},"\u002F\u002F ANYONE can decode it just as easily\n",[157,233,235,237,240,242,245],{"class":159,"line":234},7,[157,236,171],{"class":170},[157,238,239],{"class":174}," decoded",[157,241,178],{"class":170},[157,243,244],{"class":199}," atob",[157,246,247],{"class":185},"(base64);\n",[157,249,251,253,255,258],{"class":159,"line":250},8,[157,252,209],{"class":185},[157,254,212],{"class":199},[157,256,257],{"class":185},"(decoded); ",[157,259,260],{"class":163},"\u002F\u002F \"SecretPassword123\" ← No security!\n",[26,262,264],{"id":263},"real-world-analogy","Real-World Analogy",[15,266,267,268,271],{},"Think of Base64 like ",[58,269,270],{},"translating a book from English to Spanish",":",[273,274,275,279,282],"ul",{},[276,277,278],"li",{},"The content is the same, just expressed differently",[276,280,281],{},"Anyone who knows Spanish can read it",[276,283,284],{},"It's not \"locked\" or \"protected\" in any way",[15,286,287,288,271],{},"Encryption, on the other hand, is like ",[58,289,290],{},"putting the book in a safe",[273,292,293,296,299],{},[276,294,295],{},"You need the combination (key) to open it",[276,297,298],{},"Without the key, the contents are unreadable",[276,300,301],{},"It's actually protected",[10,303,305],{"id":304},"why-base64-is-not-encryption","Why Base64 is Not Encryption",[26,307,309],{"id":308},"_1-no-key-required","1. No Key Required",[124,311,313],{"className":151,"code":312,"language":153,"meta":133,"style":133},"\u002F\u002F \"Encrypting\" with Base64 (WRONG!)\nconst apiKey = \"sk_live_1234567890abcdef\";\nconst encoded = btoa(apiKey);\nconsole.log(encoded); \u002F\u002F c2tfbGl2ZV8xMjM0NTY3ODkwYWJjZGVm\n\n\u002F\u002F \"Decrypting\" (anyone can do this!)\nconst decoded = atob(encoded);\nconsole.log(decoded); \u002F\u002F sk_live_1234567890abcdef ← Exposed!\n",[131,314,315,320,334,348,360,364,369,382],{"__ignoreMap":133},[157,316,317],{"class":159,"line":160},[157,318,319],{"class":163},"\u002F\u002F \"Encrypting\" with Base64 (WRONG!)\n",[157,321,322,324,327,329,332],{"class":159,"line":167},[157,323,171],{"class":170},[157,325,326],{"class":174}," apiKey",[157,328,178],{"class":170},[157,330,331],{"class":181}," \"sk_live_1234567890abcdef\"",[157,333,186],{"class":185},[157,335,336,338,341,343,345],{"class":159,"line":189},[157,337,171],{"class":170},[157,339,340],{"class":174}," encoded",[157,342,178],{"class":170},[157,344,200],{"class":199},[157,346,347],{"class":185},"(apiKey);\n",[157,349,350,352,354,357],{"class":159,"line":206},[157,351,209],{"class":185},[157,353,212],{"class":199},[157,355,356],{"class":185},"(encoded); ",[157,358,359],{"class":163},"\u002F\u002F c2tfbGl2ZV8xMjM0NTY3ODkwYWJjZGVm\n",[157,361,362],{"class":159,"line":221},[157,363,225],{"emptyLinePlaceholder":224},[157,365,366],{"class":159,"line":228},[157,367,368],{"class":163},"\u002F\u002F \"Decrypting\" (anyone can do this!)\n",[157,370,371,373,375,377,379],{"class":159,"line":234},[157,372,171],{"class":170},[157,374,239],{"class":174},[157,376,178],{"class":170},[157,378,244],{"class":199},[157,380,381],{"class":185},"(encoded);\n",[157,383,384,386,388,390],{"class":159,"line":250},[157,385,209],{"class":185},[157,387,212],{"class":199},[157,389,257],{"class":185},[157,391,392],{"class":163},"\u002F\u002F sk_live_1234567890abcdef ← Exposed!\n",[15,394,395],{},"With real encryption, you need a secret key:",[124,397,399],{"className":151,"code":398,"language":153,"meta":133,"style":133},"\u002F\u002F Real encryption with AES-256-GCM\nconst crypto = require('crypto');\n\nfunction encrypt(text, key) {\n  const iv = crypto.randomBytes(16);\n  const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);\n  const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n  const tag = cipher.getAuthTag();\n  return Buffer.concat([iv, tag, encrypted]).toString('base64');\n}\n\nfunction decrypt(encryptedBase64, key) {\n  const data = Buffer.from(encryptedBase64, 'base64');\n  const iv = data.slice(0, 16);\n  const tag = data.slice(16, 32);\n  const encrypted = data.slice(32);\n  const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);\n  decipher.setAuthTag(tag);\n  return decipher.update(encrypted) + decipher.final('utf8');\n}\n\nconst key = crypto.randomBytes(32); \u002F\u002F Secret key (keep safe!)\nconst encrypted = encrypt('SecretData', key);\nconsole.log(encrypted); \u002F\u002F Looks random, cannot be decoded without key\n\nconst decrypted = decrypt(encrypted, key);\nconsole.log(decrypted); \u002F\u002F \"SecretData\" ← Only with correct key\n",[131,400,401,406,427,431,453,476,498,534,552,575,581,586,605,627,653,677,696,717,729,755,760,765,789,808,821,826,841],{"__ignoreMap":133},[157,402,403],{"class":159,"line":160},[157,404,405],{"class":163},"\u002F\u002F Real encryption with AES-256-GCM\n",[157,407,408,410,413,415,418,421,424],{"class":159,"line":167},[157,409,171],{"class":170},[157,411,412],{"class":174}," crypto",[157,414,178],{"class":170},[157,416,417],{"class":199}," require",[157,419,420],{"class":185},"(",[157,422,423],{"class":181},"'crypto'",[157,425,426],{"class":185},");\n",[157,428,429],{"class":159,"line":189},[157,430,225],{"emptyLinePlaceholder":224},[157,432,433,436,439,441,444,447,450],{"class":159,"line":206},[157,434,435],{"class":170},"function",[157,437,438],{"class":199}," encrypt",[157,440,420],{"class":185},[157,442,129],{"class":443},"s4XuR",[157,445,446],{"class":185},", ",[157,448,449],{"class":443},"key",[157,451,452],{"class":185},") {\n",[157,454,455,458,461,463,466,469,471,474],{"class":159,"line":221},[157,456,457],{"class":170},"  const",[157,459,460],{"class":174}," iv",[157,462,178],{"class":170},[157,464,465],{"class":185}," crypto.",[157,467,468],{"class":199},"randomBytes",[157,470,420],{"class":185},[157,472,473],{"class":174},"16",[157,475,426],{"class":185},[157,477,478,480,483,485,487,490,492,495],{"class":159,"line":228},[157,479,457],{"class":170},[157,481,482],{"class":174}," cipher",[157,484,178],{"class":170},[157,486,465],{"class":185},[157,488,489],{"class":199},"createCipheriv",[157,491,420],{"class":185},[157,493,494],{"class":181},"'aes-256-gcm'",[157,496,497],{"class":185},", key, iv);\n",[157,499,500,502,505,507,510,513,516,519,522,525,528,531],{"class":159,"line":234},[157,501,457],{"class":170},[157,503,504],{"class":174}," encrypted",[157,506,178],{"class":170},[157,508,509],{"class":185}," Buffer.",[157,511,512],{"class":199},"concat",[157,514,515],{"class":185},"([cipher.",[157,517,518],{"class":199},"update",[157,520,521],{"class":185},"(text, ",[157,523,524],{"class":181},"'utf8'",[157,526,527],{"class":185},"), cipher.",[157,529,530],{"class":199},"final",[157,532,533],{"class":185},"()]);\n",[157,535,536,538,541,543,546,549],{"class":159,"line":250},[157,537,457],{"class":170},[157,539,540],{"class":174}," tag",[157,542,178],{"class":170},[157,544,545],{"class":185}," cipher.",[157,547,548],{"class":199},"getAuthTag",[157,550,551],{"class":185},"();\n",[157,553,555,558,560,562,565,568,570,573],{"class":159,"line":554},9,[157,556,557],{"class":170},"  return",[157,559,509],{"class":185},[157,561,512],{"class":199},[157,563,564],{"class":185},"([iv, tag, encrypted]).",[157,566,567],{"class":199},"toString",[157,569,420],{"class":185},[157,571,572],{"class":181},"'base64'",[157,574,426],{"class":185},[157,576,578],{"class":159,"line":577},10,[157,579,580],{"class":185},"}\n",[157,582,584],{"class":159,"line":583},11,[157,585,225],{"emptyLinePlaceholder":224},[157,587,589,591,594,596,599,601,603],{"class":159,"line":588},12,[157,590,435],{"class":170},[157,592,593],{"class":199}," decrypt",[157,595,420],{"class":185},[157,597,598],{"class":443},"encryptedBase64",[157,600,446],{"class":185},[157,602,449],{"class":443},[157,604,452],{"class":185},[157,606,608,610,613,615,617,620,623,625],{"class":159,"line":607},13,[157,609,457],{"class":170},[157,611,612],{"class":174}," data",[157,614,178],{"class":170},[157,616,509],{"class":185},[157,618,619],{"class":199},"from",[157,621,622],{"class":185},"(encryptedBase64, ",[157,624,572],{"class":181},[157,626,426],{"class":185},[157,628,630,632,634,636,639,642,644,647,649,651],{"class":159,"line":629},14,[157,631,457],{"class":170},[157,633,460],{"class":174},[157,635,178],{"class":170},[157,637,638],{"class":185}," data.",[157,640,641],{"class":199},"slice",[157,643,420],{"class":185},[157,645,646],{"class":174},"0",[157,648,446],{"class":185},[157,650,473],{"class":174},[157,652,426],{"class":185},[157,654,656,658,660,662,664,666,668,670,672,675],{"class":159,"line":655},15,[157,657,457],{"class":170},[157,659,540],{"class":174},[157,661,178],{"class":170},[157,663,638],{"class":185},[157,665,641],{"class":199},[157,667,420],{"class":185},[157,669,473],{"class":174},[157,671,446],{"class":185},[157,673,674],{"class":174},"32",[157,676,426],{"class":185},[157,678,680,682,684,686,688,690,692,694],{"class":159,"line":679},16,[157,681,457],{"class":170},[157,683,504],{"class":174},[157,685,178],{"class":170},[157,687,638],{"class":185},[157,689,641],{"class":199},[157,691,420],{"class":185},[157,693,674],{"class":174},[157,695,426],{"class":185},[157,697,699,701,704,706,708,711,713,715],{"class":159,"line":698},17,[157,700,457],{"class":170},[157,702,703],{"class":174}," decipher",[157,705,178],{"class":170},[157,707,465],{"class":185},[157,709,710],{"class":199},"createDecipheriv",[157,712,420],{"class":185},[157,714,494],{"class":181},[157,716,497],{"class":185},[157,718,720,723,726],{"class":159,"line":719},18,[157,721,722],{"class":185},"  decipher.",[157,724,725],{"class":199},"setAuthTag",[157,727,728],{"class":185},"(tag);\n",[157,730,732,734,737,739,742,745,747,749,751,753],{"class":159,"line":731},19,[157,733,557],{"class":170},[157,735,736],{"class":185}," decipher.",[157,738,518],{"class":199},[157,740,741],{"class":185},"(encrypted) ",[157,743,744],{"class":170},"+",[157,746,736],{"class":185},[157,748,530],{"class":199},[157,750,420],{"class":185},[157,752,524],{"class":181},[157,754,426],{"class":185},[157,756,758],{"class":159,"line":757},20,[157,759,580],{"class":185},[157,761,763],{"class":159,"line":762},21,[157,764,225],{"emptyLinePlaceholder":224},[157,766,768,770,773,775,777,779,781,783,786],{"class":159,"line":767},22,[157,769,171],{"class":170},[157,771,772],{"class":174}," key",[157,774,178],{"class":170},[157,776,465],{"class":185},[157,778,468],{"class":199},[157,780,420],{"class":185},[157,782,674],{"class":174},[157,784,785],{"class":185},"); ",[157,787,788],{"class":163},"\u002F\u002F Secret key (keep safe!)\n",[157,790,792,794,796,798,800,802,805],{"class":159,"line":791},23,[157,793,171],{"class":170},[157,795,504],{"class":174},[157,797,178],{"class":170},[157,799,438],{"class":199},[157,801,420],{"class":185},[157,803,804],{"class":181},"'SecretData'",[157,806,807],{"class":185},", key);\n",[157,809,811,813,815,818],{"class":159,"line":810},24,[157,812,209],{"class":185},[157,814,212],{"class":199},[157,816,817],{"class":185},"(encrypted); ",[157,819,820],{"class":163},"\u002F\u002F Looks random, cannot be decoded without key\n",[157,822,824],{"class":159,"line":823},25,[157,825,225],{"emptyLinePlaceholder":224},[157,827,829,831,834,836,838],{"class":159,"line":828},26,[157,830,171],{"class":170},[157,832,833],{"class":174}," decrypted",[157,835,178],{"class":170},[157,837,593],{"class":199},[157,839,840],{"class":185},"(encrypted, key);\n",[157,842,844,846,848,851],{"class":159,"line":843},27,[157,845,209],{"class":185},[157,847,212],{"class":199},[157,849,850],{"class":185},"(decrypted); ",[157,852,853],{"class":163},"\u002F\u002F \"SecretData\" ← Only with correct key\n",[26,855,857],{"id":856},"_2-base64-is-standardized-and-well-known","2. Base64 is Standardized and Well-Known",[15,859,860],{},"The Base64 alphabet is public knowledge. There's no \"secret\" to how it works:",[124,862,866],{"className":863,"code":864,"language":865,"meta":133,"style":133},"language-python shiki shiki-themes github-light github-dark","import base64\n\n# Anyone can do this\nencoded = base64.b64encode(b\"password123\")\nprint(encoded)  # cGFzc3dvcmQxMjM=\n\ndecoded = base64.b64decode(encoded)\nprint(decoded)  # b'password123'  \u003C- Exposed immediately\n","python",[131,867,868,873,877,882,887,892,896,901],{"__ignoreMap":133},[157,869,870],{"class":159,"line":160},[157,871,872],{},"import base64\n",[157,874,875],{"class":159,"line":167},[157,876,225],{"emptyLinePlaceholder":224},[157,878,879],{"class":159,"line":189},[157,880,881],{},"# Anyone can do this\n",[157,883,884],{"class":159,"line":206},[157,885,886],{},"encoded = base64.b64encode(b\"password123\")\n",[157,888,889],{"class":159,"line":221},[157,890,891],{},"print(encoded)  # cGFzc3dvcmQxMjM=\n",[157,893,894],{"class":159,"line":228},[157,895,225],{"emptyLinePlaceholder":224},[157,897,898],{"class":159,"line":234},[157,899,900],{},"decoded = base64.b64decode(encoded)\n",[157,902,903],{"class":159,"line":250},[157,904,905],{},"print(decoded)  # b'password123'  \u003C- Exposed immediately\n",[26,907,909],{"id":908},"_3-base64-is-designed-for-compatibility-not-security","3. Base64 is Designed for Compatibility, Not Security",[15,911,912,913,916],{},"Base64 exists to solve a ",[58,914,915],{},"data representation problem",", not a security problem:",[273,918,919,922,925,928],{},[276,920,921],{},"Email attachments (MIME) need text format",[276,923,924],{},"JSON cannot contain raw binary",[276,926,927],{},"URLs cannot contain certain characters",[276,929,930],{},"Data URIs need ASCII representation",[15,932,933],{},"None of these use cases involve hiding data from unauthorized viewers.",[10,935,937],{"id":936},"common-misconceptions-and-dangerous-practices","Common Misconceptions and Dangerous Practices",[26,939,941],{"id":940},"storing-encrypted-passwords-with-base64","❌ Storing \"Encrypted\" Passwords with Base64",[124,943,945],{"className":151,"code":944,"language":153,"meta":133,"style":133},"\u002F\u002F WRONG: This is NOT password encryption!\nconst password = \"user_password\";\nconst stored = btoa(password); \u002F\u002F Store in database\n\u002F\u002F Later...\nconst retrieved = atob(stored); \u002F\u002F \"user_password\" ← Exposed!\n\n\u002F\u002F CORRECT: Use a password hashing function\nconst bcrypt = require('bcrypt');\nconst hashedPassword = await bcrypt.hash(password, 12);\n\u002F\u002F Store hashedPassword (cannot be reversed)\n",[131,946,947,952,966,983,988,1005,1009,1014,1032,1058],{"__ignoreMap":133},[157,948,949],{"class":159,"line":160},[157,950,951],{"class":163},"\u002F\u002F WRONG: This is NOT password encryption!\n",[157,953,954,956,959,961,964],{"class":159,"line":167},[157,955,171],{"class":170},[157,957,958],{"class":174}," password",[157,960,178],{"class":170},[157,962,963],{"class":181}," \"user_password\"",[157,965,186],{"class":185},[157,967,968,970,973,975,977,980],{"class":159,"line":189},[157,969,171],{"class":170},[157,971,972],{"class":174}," stored",[157,974,178],{"class":170},[157,976,200],{"class":199},[157,978,979],{"class":185},"(password); ",[157,981,982],{"class":163},"\u002F\u002F Store in database\n",[157,984,985],{"class":159,"line":206},[157,986,987],{"class":163},"\u002F\u002F Later...\n",[157,989,990,992,995,997,999,1002],{"class":159,"line":221},[157,991,171],{"class":170},[157,993,994],{"class":174}," retrieved",[157,996,178],{"class":170},[157,998,244],{"class":199},[157,1000,1001],{"class":185},"(stored); ",[157,1003,1004],{"class":163},"\u002F\u002F \"user_password\" ← Exposed!\n",[157,1006,1007],{"class":159,"line":228},[157,1008,225],{"emptyLinePlaceholder":224},[157,1010,1011],{"class":159,"line":234},[157,1012,1013],{"class":163},"\u002F\u002F CORRECT: Use a password hashing function\n",[157,1015,1016,1018,1021,1023,1025,1027,1030],{"class":159,"line":250},[157,1017,171],{"class":170},[157,1019,1020],{"class":174}," bcrypt",[157,1022,178],{"class":170},[157,1024,417],{"class":199},[157,1026,420],{"class":185},[157,1028,1029],{"class":181},"'bcrypt'",[157,1031,426],{"class":185},[157,1033,1034,1036,1039,1041,1044,1047,1050,1053,1056],{"class":159,"line":554},[157,1035,171],{"class":170},[157,1037,1038],{"class":174}," hashedPassword",[157,1040,178],{"class":170},[157,1042,1043],{"class":170}," await",[157,1045,1046],{"class":185}," bcrypt.",[157,1048,1049],{"class":199},"hash",[157,1051,1052],{"class":185},"(password, ",[157,1054,1055],{"class":174},"12",[157,1057,426],{"class":185},[157,1059,1060],{"class":159,"line":577},[157,1061,1062],{"class":163},"\u002F\u002F Store hashedPassword (cannot be reversed)\n",[26,1064,1066],{"id":1065},"hiding-api-keys-in-client-side-code","❌ Hiding API Keys in Client-Side Code",[124,1068,1070],{"className":151,"code":1069,"language":153,"meta":133,"style":133},"\u002F\u002F WRONG: Base64 doesn't hide anything in shipped code!\nconst encodedKey = btoa(\"sk_live_12345\");\n\u002F\u002F Anyone can open DevTools, see this, and decode it\n\n\u002F\u002F CORRECT: Keep API keys on the server side\n\u002F\u002F Client sends request → Server uses API key → Returns result\n",[131,1071,1072,1077,1095,1100,1104,1109],{"__ignoreMap":133},[157,1073,1074],{"class":159,"line":160},[157,1075,1076],{"class":163},"\u002F\u002F WRONG: Base64 doesn't hide anything in shipped code!\n",[157,1078,1079,1081,1084,1086,1088,1090,1093],{"class":159,"line":167},[157,1080,171],{"class":170},[157,1082,1083],{"class":174}," encodedKey",[157,1085,178],{"class":170},[157,1087,200],{"class":199},[157,1089,420],{"class":185},[157,1091,1092],{"class":181},"\"sk_live_12345\"",[157,1094,426],{"class":185},[157,1096,1097],{"class":159,"line":189},[157,1098,1099],{"class":163},"\u002F\u002F Anyone can open DevTools, see this, and decode it\n",[157,1101,1102],{"class":159,"line":206},[157,1103,225],{"emptyLinePlaceholder":224},[157,1105,1106],{"class":159,"line":221},[157,1107,1108],{"class":163},"\u002F\u002F CORRECT: Keep API keys on the server side\n",[157,1110,1111],{"class":159,"line":228},[157,1112,1113],{"class":163},"\u002F\u002F Client sends request → Server uses API key → Returns result\n",[26,1115,1117],{"id":1116},"encrypting-jwt-secrets-with-base64","❌ \"Encrypting\" JWT Secrets with Base64",[124,1119,1121],{"className":151,"code":1120,"language":153,"meta":133,"style":133},"\u002F\u002F WRONG: Base64 is not encryption!\nconst fakeSecret = btoa(\"my-secret-key\"); \u002F\u002F Anyone can decode!\n\n\u002F\u002F CORRECT: Use a strong, random secret (never encode with Base64 for security)\nconst realSecret = crypto.randomBytes(32).toString('hex'); \u002F\u002F 256-bit random key\n",[131,1122,1123,1128,1149,1153,1158],{"__ignoreMap":133},[157,1124,1125],{"class":159,"line":160},[157,1126,1127],{"class":163},"\u002F\u002F WRONG: Base64 is not encryption!\n",[157,1129,1130,1132,1135,1137,1139,1141,1144,1146],{"class":159,"line":167},[157,1131,171],{"class":170},[157,1133,1134],{"class":174}," fakeSecret",[157,1136,178],{"class":170},[157,1138,200],{"class":199},[157,1140,420],{"class":185},[157,1142,1143],{"class":181},"\"my-secret-key\"",[157,1145,785],{"class":185},[157,1147,1148],{"class":163},"\u002F\u002F Anyone can decode!\n",[157,1150,1151],{"class":159,"line":189},[157,1152,225],{"emptyLinePlaceholder":224},[157,1154,1155],{"class":159,"line":206},[157,1156,1157],{"class":163},"\u002F\u002F CORRECT: Use a strong, random secret (never encode with Base64 for security)\n",[157,1159,1160,1162,1165,1167,1169,1171,1173,1175,1178,1180,1182,1185,1187],{"class":159,"line":221},[157,1161,171],{"class":170},[157,1163,1164],{"class":174}," realSecret",[157,1166,178],{"class":170},[157,1168,465],{"class":185},[157,1170,468],{"class":199},[157,1172,420],{"class":185},[157,1174,674],{"class":174},[157,1176,1177],{"class":185},").",[157,1179,567],{"class":199},[157,1181,420],{"class":185},[157,1183,1184],{"class":181},"'hex'",[157,1186,785],{"class":185},[157,1188,1189],{"class":163},"\u002F\u002F 256-bit random key\n",[10,1191,1193],{"id":1192},"when-base64-is-actually-appropriate","When Base64 is Actually Appropriate",[15,1195,1196],{},"Base64 has many legitimate uses — just not for security:",[26,1198,1200],{"id":1199},"legitimate-uses","✅ Legitimate Uses",[15,1202,1203],{},[58,1204,1205],{},"1. Data URIs (embedding images)",[124,1207,1211],{"className":1208,"code":1209,"language":1210,"meta":133,"style":133},"language-html shiki shiki-themes github-light github-dark","\u003Cimg src=\"data:image\u002Fpng;base64,iVBORw0KGgo...\">\n","html",[131,1212,1213],{"__ignoreMap":133},[157,1214,1215,1218,1222,1225,1228,1231],{"class":159,"line":160},[157,1216,1217],{"class":185},"\u003C",[157,1219,1221],{"class":1220},"s9eBZ","img",[157,1223,1224],{"class":199}," src",[157,1226,1227],{"class":185},"=",[157,1229,1230],{"class":181},"\"data:image\u002Fpng;base64,iVBORw0KGgo...\"",[157,1232,1233],{"class":185},">\n",[15,1235,1236],{},[58,1237,1238],{},"2. JWT Payload Encoding",[124,1240,1242],{"className":151,"code":1241,"language":153,"meta":133,"style":133},"\u002F\u002F JWT uses Base64URL for data representation, not security\nconst payload = { userId: 123, exp: 1234567890 };\nconst encoded = btoa(JSON.stringify(payload)); \u002F\u002F Just encoding, not encrypting\n",[131,1243,1244,1249,1273],{"__ignoreMap":133},[157,1245,1246],{"class":159,"line":160},[157,1247,1248],{"class":163},"\u002F\u002F JWT uses Base64URL for data representation, not security\n",[157,1250,1251,1253,1256,1258,1261,1264,1267,1270],{"class":159,"line":167},[157,1252,171],{"class":170},[157,1254,1255],{"class":174}," payload",[157,1257,178],{"class":170},[157,1259,1260],{"class":185}," { userId: ",[157,1262,1263],{"class":174},"123",[157,1265,1266],{"class":185},", exp: ",[157,1268,1269],{"class":174},"1234567890",[157,1271,1272],{"class":185}," };\n",[157,1274,1275,1277,1279,1281,1283,1285,1288,1291,1294,1297],{"class":159,"line":189},[157,1276,171],{"class":170},[157,1278,340],{"class":174},[157,1280,178],{"class":170},[157,1282,200],{"class":199},[157,1284,420],{"class":185},[157,1286,1287],{"class":174},"JSON",[157,1289,1290],{"class":185},".",[157,1292,1293],{"class":199},"stringify",[157,1295,1296],{"class":185},"(payload)); ",[157,1298,1299],{"class":163},"\u002F\u002F Just encoding, not encrypting\n",[15,1301,1302],{},[58,1303,1304],{},"3. Email Attachments (MIME)",[124,1306,1310],{"className":1307,"code":1308,"language":1309,"meta":133,"style":133},"language-email shiki shiki-themes github-light github-dark","Content-Type: image\u002Fpng\nContent-Transfer-Encoding: base64\n\niVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAA...\n","email",[131,1311,1312,1317,1322,1326],{"__ignoreMap":133},[157,1313,1314],{"class":159,"line":160},[157,1315,1316],{},"Content-Type: image\u002Fpng\n",[157,1318,1319],{"class":159,"line":167},[157,1320,1321],{},"Content-Transfer-Encoding: base64\n",[157,1323,1324],{"class":159,"line":189},[157,1325,225],{"emptyLinePlaceholder":224},[157,1327,1328],{"class":159,"line":206},[157,1329,1330],{},"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAA...\n",[15,1332,1333],{},[58,1334,1335],{},"4. Binary Data in JSON",[124,1337,1341],{"className":1338,"code":1339,"language":1340,"meta":133,"style":133},"language-json shiki shiki-themes github-light github-dark","{\n  \"filename\": \"image.png\",\n  \"data\": \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAA...\"\n}\n","json",[131,1342,1343,1348,1362,1372],{"__ignoreMap":133},[157,1344,1345],{"class":159,"line":160},[157,1346,1347],{"class":185},"{\n",[157,1349,1350,1353,1356,1359],{"class":159,"line":167},[157,1351,1352],{"class":174},"  \"filename\"",[157,1354,1355],{"class":185},": ",[157,1357,1358],{"class":181},"\"image.png\"",[157,1360,1361],{"class":185},",\n",[157,1363,1364,1367,1369],{"class":159,"line":189},[157,1365,1366],{"class":174},"  \"data\"",[157,1368,1355],{"class":185},[157,1370,1371],{"class":181},"\"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAA...\"\n",[157,1373,1374],{"class":159,"line":206},[157,1375,580],{"class":185},[10,1377,1379],{"id":1378},"how-to-actually-protect-data","How to Actually Protect Data",[26,1381,1383],{"id":1382},"_1-password-hashing-one-way","1. Password Hashing (One-Way)",[15,1385,1386],{},"For storing passwords, use a cryptographic hash function designed for passwords:",[124,1388,1390],{"className":151,"code":1389,"language":153,"meta":133,"style":133},"const bcrypt = require('bcrypt');\n\n\u002F\u002F Hash the password (one-way, cannot be reversed)\nconst password = \"user_password\";\nconst hash = await bcrypt.hash(password, 12); \u002F\u002F Salt included automatically\n\n\u002F\u002F Verify password (compare, don't decrypt)\nconst isMatch = await bcrypt.compare(\"user_password\", hash); \u002F\u002F true\nconst isWrong = await bcrypt.compare(\"wrong_password\", hash); \u002F\u002F false\n",[131,1391,1392,1408,1412,1417,1429,1453,1457,1462,1489],{"__ignoreMap":133},[157,1393,1394,1396,1398,1400,1402,1404,1406],{"class":159,"line":160},[157,1395,171],{"class":170},[157,1397,1020],{"class":174},[157,1399,178],{"class":170},[157,1401,417],{"class":199},[157,1403,420],{"class":185},[157,1405,1029],{"class":181},[157,1407,426],{"class":185},[157,1409,1410],{"class":159,"line":167},[157,1411,225],{"emptyLinePlaceholder":224},[157,1413,1414],{"class":159,"line":189},[157,1415,1416],{"class":163},"\u002F\u002F Hash the password (one-way, cannot be reversed)\n",[157,1418,1419,1421,1423,1425,1427],{"class":159,"line":206},[157,1420,171],{"class":170},[157,1422,958],{"class":174},[157,1424,178],{"class":170},[157,1426,963],{"class":181},[157,1428,186],{"class":185},[157,1430,1431,1433,1436,1438,1440,1442,1444,1446,1448,1450],{"class":159,"line":221},[157,1432,171],{"class":170},[157,1434,1435],{"class":174}," hash",[157,1437,178],{"class":170},[157,1439,1043],{"class":170},[157,1441,1046],{"class":185},[157,1443,1049],{"class":199},[157,1445,1052],{"class":185},[157,1447,1055],{"class":174},[157,1449,785],{"class":185},[157,1451,1452],{"class":163},"\u002F\u002F Salt included automatically\n",[157,1454,1455],{"class":159,"line":228},[157,1456,225],{"emptyLinePlaceholder":224},[157,1458,1459],{"class":159,"line":234},[157,1460,1461],{"class":163},"\u002F\u002F Verify password (compare, don't decrypt)\n",[157,1463,1464,1466,1469,1471,1473,1475,1478,1480,1483,1486],{"class":159,"line":250},[157,1465,171],{"class":170},[157,1467,1468],{"class":174}," isMatch",[157,1470,178],{"class":170},[157,1472,1043],{"class":170},[157,1474,1046],{"class":185},[157,1476,1477],{"class":199},"compare",[157,1479,420],{"class":185},[157,1481,1482],{"class":181},"\"user_password\"",[157,1484,1485],{"class":185},", hash); ",[157,1487,1488],{"class":163},"\u002F\u002F true\n",[157,1490,1491,1493,1496,1498,1500,1502,1504,1506,1509,1511],{"class":159,"line":554},[157,1492,171],{"class":170},[157,1494,1495],{"class":174}," isWrong",[157,1497,178],{"class":170},[157,1499,1043],{"class":170},[157,1501,1046],{"class":185},[157,1503,1477],{"class":199},[157,1505,420],{"class":185},[157,1507,1508],{"class":181},"\"wrong_password\"",[157,1510,1485],{"class":185},[157,1512,1513],{"class":163},"\u002F\u002F false\n",[15,1515,1516],{},[58,1517,1518],{},"Recommended algorithms (2026):",[1520,1521,1522,1528,1534],"ol",{},[276,1523,1524,1527],{},[58,1525,1526],{},"Argon2id"," (best)",[276,1529,1530,1533],{},[58,1531,1532],{},"bcrypt"," (widely supported)",[276,1535,1536,1539],{},[58,1537,1538],{},"scrypt"," (good alternative)",[26,1541,1543],{"id":1542},"_2-symmetric-encryption-two-way-same-key","2. Symmetric Encryption (Two-Way, Same Key)",[15,1545,1546],{},"For data you need to encrypt and decrypt:",[124,1548,1550],{"className":151,"code":1549,"language":153,"meta":133,"style":133},"const crypto = require('crypto');\n\nfunction encryptSymmetric(text, key) {\n  const iv = crypto.randomBytes(16);\n  const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);\n  const encrypted = cipher.update(text, 'utf8', 'hex') + cipher.final('hex');\n  const tag = cipher.getAuthTag();\n  return iv.toString('hex') + ':' + tag.toString('hex') + ':' + encrypted;\n}\n\nfunction decryptSymmetric(encrypted, key) {\n  const parts = encrypted.split(':');\n  const iv = Buffer.from(parts[0], 'hex');\n  const tag = Buffer.from(parts[1], 'hex');\n  const encryptedText = parts[2];\n  const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);\n  decipher.setAuthTag(tag);\n  return decipher.update(encryptedText, 'hex', 'utf8') + decipher.final('utf8');\n}\n\nconst key = crypto.randomBytes(32); \u002F\u002F Keep this secret!\nconst encrypted = encryptSymmetric(\"Secret data\", key);\nconst decrypted = decryptSymmetric(encrypted, key);\n",[131,1551,1552,1568,1572,1589,1607,1625,1660,1674,1717,1721,1725,1743,1765,1789,1812,1830,1848,1856,1887,1891,1895,1916,1933],{"__ignoreMap":133},[157,1553,1554,1556,1558,1560,1562,1564,1566],{"class":159,"line":160},[157,1555,171],{"class":170},[157,1557,412],{"class":174},[157,1559,178],{"class":170},[157,1561,417],{"class":199},[157,1563,420],{"class":185},[157,1565,423],{"class":181},[157,1567,426],{"class":185},[157,1569,1570],{"class":159,"line":167},[157,1571,225],{"emptyLinePlaceholder":224},[157,1573,1574,1576,1579,1581,1583,1585,1587],{"class":159,"line":189},[157,1575,435],{"class":170},[157,1577,1578],{"class":199}," encryptSymmetric",[157,1580,420],{"class":185},[157,1582,129],{"class":443},[157,1584,446],{"class":185},[157,1586,449],{"class":443},[157,1588,452],{"class":185},[157,1590,1591,1593,1595,1597,1599,1601,1603,1605],{"class":159,"line":206},[157,1592,457],{"class":170},[157,1594,460],{"class":174},[157,1596,178],{"class":170},[157,1598,465],{"class":185},[157,1600,468],{"class":199},[157,1602,420],{"class":185},[157,1604,473],{"class":174},[157,1606,426],{"class":185},[157,1608,1609,1611,1613,1615,1617,1619,1621,1623],{"class":159,"line":221},[157,1610,457],{"class":170},[157,1612,482],{"class":174},[157,1614,178],{"class":170},[157,1616,465],{"class":185},[157,1618,489],{"class":199},[157,1620,420],{"class":185},[157,1622,494],{"class":181},[157,1624,497],{"class":185},[157,1626,1627,1629,1631,1633,1635,1637,1639,1641,1643,1645,1648,1650,1652,1654,1656,1658],{"class":159,"line":228},[157,1628,457],{"class":170},[157,1630,504],{"class":174},[157,1632,178],{"class":170},[157,1634,545],{"class":185},[157,1636,518],{"class":199},[157,1638,521],{"class":185},[157,1640,524],{"class":181},[157,1642,446],{"class":185},[157,1644,1184],{"class":181},[157,1646,1647],{"class":185},") ",[157,1649,744],{"class":170},[157,1651,545],{"class":185},[157,1653,530],{"class":199},[157,1655,420],{"class":185},[157,1657,1184],{"class":181},[157,1659,426],{"class":185},[157,1661,1662,1664,1666,1668,1670,1672],{"class":159,"line":234},[157,1663,457],{"class":170},[157,1665,540],{"class":174},[157,1667,178],{"class":170},[157,1669,545],{"class":185},[157,1671,548],{"class":199},[157,1673,551],{"class":185},[157,1675,1676,1678,1681,1683,1685,1687,1689,1691,1694,1697,1700,1702,1704,1706,1708,1710,1712,1714],{"class":159,"line":250},[157,1677,557],{"class":170},[157,1679,1680],{"class":185}," iv.",[157,1682,567],{"class":199},[157,1684,420],{"class":185},[157,1686,1184],{"class":181},[157,1688,1647],{"class":185},[157,1690,744],{"class":170},[157,1692,1693],{"class":181}," ':'",[157,1695,1696],{"class":170}," +",[157,1698,1699],{"class":185}," tag.",[157,1701,567],{"class":199},[157,1703,420],{"class":185},[157,1705,1184],{"class":181},[157,1707,1647],{"class":185},[157,1709,744],{"class":170},[157,1711,1693],{"class":181},[157,1713,1696],{"class":170},[157,1715,1716],{"class":185}," encrypted;\n",[157,1718,1719],{"class":159,"line":554},[157,1720,580],{"class":185},[157,1722,1723],{"class":159,"line":577},[157,1724,225],{"emptyLinePlaceholder":224},[157,1726,1727,1729,1732,1734,1737,1739,1741],{"class":159,"line":583},[157,1728,435],{"class":170},[157,1730,1731],{"class":199}," decryptSymmetric",[157,1733,420],{"class":185},[157,1735,1736],{"class":443},"encrypted",[157,1738,446],{"class":185},[157,1740,449],{"class":443},[157,1742,452],{"class":185},[157,1744,1745,1747,1750,1752,1755,1758,1760,1763],{"class":159,"line":588},[157,1746,457],{"class":170},[157,1748,1749],{"class":174}," parts",[157,1751,178],{"class":170},[157,1753,1754],{"class":185}," encrypted.",[157,1756,1757],{"class":199},"split",[157,1759,420],{"class":185},[157,1761,1762],{"class":181},"':'",[157,1764,426],{"class":185},[157,1766,1767,1769,1771,1773,1775,1777,1780,1782,1785,1787],{"class":159,"line":607},[157,1768,457],{"class":170},[157,1770,460],{"class":174},[157,1772,178],{"class":170},[157,1774,509],{"class":185},[157,1776,619],{"class":199},[157,1778,1779],{"class":185},"(parts[",[157,1781,646],{"class":174},[157,1783,1784],{"class":185},"], ",[157,1786,1184],{"class":181},[157,1788,426],{"class":185},[157,1790,1791,1793,1795,1797,1799,1801,1803,1806,1808,1810],{"class":159,"line":629},[157,1792,457],{"class":170},[157,1794,540],{"class":174},[157,1796,178],{"class":170},[157,1798,509],{"class":185},[157,1800,619],{"class":199},[157,1802,1779],{"class":185},[157,1804,1805],{"class":174},"1",[157,1807,1784],{"class":185},[157,1809,1184],{"class":181},[157,1811,426],{"class":185},[157,1813,1814,1816,1819,1821,1824,1827],{"class":159,"line":655},[157,1815,457],{"class":170},[157,1817,1818],{"class":174}," encryptedText",[157,1820,178],{"class":170},[157,1822,1823],{"class":185}," parts[",[157,1825,1826],{"class":174},"2",[157,1828,1829],{"class":185},"];\n",[157,1831,1832,1834,1836,1838,1840,1842,1844,1846],{"class":159,"line":679},[157,1833,457],{"class":170},[157,1835,703],{"class":174},[157,1837,178],{"class":170},[157,1839,465],{"class":185},[157,1841,710],{"class":199},[157,1843,420],{"class":185},[157,1845,494],{"class":181},[157,1847,497],{"class":185},[157,1849,1850,1852,1854],{"class":159,"line":698},[157,1851,722],{"class":185},[157,1853,725],{"class":199},[157,1855,728],{"class":185},[157,1857,1858,1860,1862,1864,1867,1869,1871,1873,1875,1877,1879,1881,1883,1885],{"class":159,"line":719},[157,1859,557],{"class":170},[157,1861,736],{"class":185},[157,1863,518],{"class":199},[157,1865,1866],{"class":185},"(encryptedText, ",[157,1868,1184],{"class":181},[157,1870,446],{"class":185},[157,1872,524],{"class":181},[157,1874,1647],{"class":185},[157,1876,744],{"class":170},[157,1878,736],{"class":185},[157,1880,530],{"class":199},[157,1882,420],{"class":185},[157,1884,524],{"class":181},[157,1886,426],{"class":185},[157,1888,1889],{"class":159,"line":731},[157,1890,580],{"class":185},[157,1892,1893],{"class":159,"line":757},[157,1894,225],{"emptyLinePlaceholder":224},[157,1896,1897,1899,1901,1903,1905,1907,1909,1911,1913],{"class":159,"line":762},[157,1898,171],{"class":170},[157,1900,772],{"class":174},[157,1902,178],{"class":170},[157,1904,465],{"class":185},[157,1906,468],{"class":199},[157,1908,420],{"class":185},[157,1910,674],{"class":174},[157,1912,785],{"class":185},[157,1914,1915],{"class":163},"\u002F\u002F Keep this secret!\n",[157,1917,1918,1920,1922,1924,1926,1928,1931],{"class":159,"line":767},[157,1919,171],{"class":170},[157,1921,504],{"class":174},[157,1923,178],{"class":170},[157,1925,1578],{"class":199},[157,1927,420],{"class":185},[157,1929,1930],{"class":181},"\"Secret data\"",[157,1932,807],{"class":185},[157,1934,1935,1937,1939,1941,1943],{"class":159,"line":791},[157,1936,171],{"class":170},[157,1938,833],{"class":174},[157,1940,178],{"class":170},[157,1942,1731],{"class":199},[157,1944,840],{"class":185},[26,1946,1948],{"id":1947},"_3-asymmetric-encryption-two-way-publicprivate-key","3. Asymmetric Encryption (Two-Way, Public\u002FPrivate Key)",[15,1950,1951],{},"For sharing encrypted data without sharing the decryption key:",[124,1953,1955],{"className":151,"code":1954,"language":153,"meta":133,"style":133},"const crypto = require('crypto');\n\n\u002F\u002F Generate key pair\nconst { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {\n  modulusLength: 2048,\n  publicKeyEncoding: { type: 'spki', format: 'pem' },\n  privateKeyEncoding: { type: 'pkcs8', format: 'pem' }\n});\n\n\u002F\u002F Encrypt with public key (anyone can encrypt)\nconst encrypted = crypto.publicEncrypt(\n  publicKey,\n  Buffer.from(\"Secret message\")\n).toString('base64');\n\n\u002F\u002F Decrypt with private key (only you can decrypt)\nconst decrypted = crypto.privateDecrypt(\n  privateKey,\n  Buffer.from(encrypted, 'base64')\n).toString();\n\nconsole.log(decrypted); \u002F\u002F \"Secret message\"\n",[131,1956,1957,1973,1977,1982,2015,2025,2042,2057,2062,2066,2071,2087,2092,2107,2119,2123,2128,2143,2148,2161,2169,2173],{"__ignoreMap":133},[157,1958,1959,1961,1963,1965,1967,1969,1971],{"class":159,"line":160},[157,1960,171],{"class":170},[157,1962,412],{"class":174},[157,1964,178],{"class":170},[157,1966,417],{"class":199},[157,1968,420],{"class":185},[157,1970,423],{"class":181},[157,1972,426],{"class":185},[157,1974,1975],{"class":159,"line":167},[157,1976,225],{"emptyLinePlaceholder":224},[157,1978,1979],{"class":159,"line":189},[157,1980,1981],{"class":163},"\u002F\u002F Generate key pair\n",[157,1983,1984,1986,1989,1992,1994,1997,2000,2002,2004,2007,2009,2012],{"class":159,"line":206},[157,1985,171],{"class":170},[157,1987,1988],{"class":185}," { ",[157,1990,1991],{"class":174},"publicKey",[157,1993,446],{"class":185},[157,1995,1996],{"class":174},"privateKey",[157,1998,1999],{"class":185}," } ",[157,2001,1227],{"class":170},[157,2003,465],{"class":185},[157,2005,2006],{"class":199},"generateKeyPairSync",[157,2008,420],{"class":185},[157,2010,2011],{"class":181},"'rsa'",[157,2013,2014],{"class":185},", {\n",[157,2016,2017,2020,2023],{"class":159,"line":221},[157,2018,2019],{"class":185},"  modulusLength: ",[157,2021,2022],{"class":174},"2048",[157,2024,1361],{"class":185},[157,2026,2027,2030,2033,2036,2039],{"class":159,"line":228},[157,2028,2029],{"class":185},"  publicKeyEncoding: { type: ",[157,2031,2032],{"class":181},"'spki'",[157,2034,2035],{"class":185},", format: ",[157,2037,2038],{"class":181},"'pem'",[157,2040,2041],{"class":185}," },\n",[157,2043,2044,2047,2050,2052,2054],{"class":159,"line":234},[157,2045,2046],{"class":185},"  privateKeyEncoding: { type: ",[157,2048,2049],{"class":181},"'pkcs8'",[157,2051,2035],{"class":185},[157,2053,2038],{"class":181},[157,2055,2056],{"class":185}," }\n",[157,2058,2059],{"class":159,"line":250},[157,2060,2061],{"class":185},"});\n",[157,2063,2064],{"class":159,"line":554},[157,2065,225],{"emptyLinePlaceholder":224},[157,2067,2068],{"class":159,"line":577},[157,2069,2070],{"class":163},"\u002F\u002F Encrypt with public key (anyone can encrypt)\n",[157,2072,2073,2075,2077,2079,2081,2084],{"class":159,"line":583},[157,2074,171],{"class":170},[157,2076,504],{"class":174},[157,2078,178],{"class":170},[157,2080,465],{"class":185},[157,2082,2083],{"class":199},"publicEncrypt",[157,2085,2086],{"class":185},"(\n",[157,2088,2089],{"class":159,"line":588},[157,2090,2091],{"class":185},"  publicKey,\n",[157,2093,2094,2097,2099,2101,2104],{"class":159,"line":607},[157,2095,2096],{"class":185},"  Buffer.",[157,2098,619],{"class":199},[157,2100,420],{"class":185},[157,2102,2103],{"class":181},"\"Secret message\"",[157,2105,2106],{"class":185},")\n",[157,2108,2109,2111,2113,2115,2117],{"class":159,"line":629},[157,2110,1177],{"class":185},[157,2112,567],{"class":199},[157,2114,420],{"class":185},[157,2116,572],{"class":181},[157,2118,426],{"class":185},[157,2120,2121],{"class":159,"line":655},[157,2122,225],{"emptyLinePlaceholder":224},[157,2124,2125],{"class":159,"line":679},[157,2126,2127],{"class":163},"\u002F\u002F Decrypt with private key (only you can decrypt)\n",[157,2129,2130,2132,2134,2136,2138,2141],{"class":159,"line":698},[157,2131,171],{"class":170},[157,2133,833],{"class":174},[157,2135,178],{"class":170},[157,2137,465],{"class":185},[157,2139,2140],{"class":199},"privateDecrypt",[157,2142,2086],{"class":185},[157,2144,2145],{"class":159,"line":719},[157,2146,2147],{"class":185},"  privateKey,\n",[157,2149,2150,2152,2154,2157,2159],{"class":159,"line":731},[157,2151,2096],{"class":185},[157,2153,619],{"class":199},[157,2155,2156],{"class":185},"(encrypted, ",[157,2158,572],{"class":181},[157,2160,2106],{"class":185},[157,2162,2163,2165,2167],{"class":159,"line":757},[157,2164,1177],{"class":185},[157,2166,567],{"class":199},[157,2168,551],{"class":185},[157,2170,2171],{"class":159,"line":762},[157,2172,225],{"emptyLinePlaceholder":224},[157,2174,2175,2177,2179,2181],{"class":159,"line":767},[157,2176,209],{"class":185},[157,2178,212],{"class":199},[157,2180,850],{"class":185},[157,2182,2183],{"class":163},"\u002F\u002F \"Secret message\"\n",[10,2185,2187],{"id":2186},"quick-comparison-table","Quick Comparison Table",[31,2189,2190,2206],{},[34,2191,2192],{},[37,2193,2194,2197,2200,2203],{},[40,2195,2196],{},"Scenario",[40,2198,2199],{},"Use Base64",[40,2201,2202],{},"Use Hashing",[40,2204,2205],{},"Use Encryption",[50,2207,2208,2221,2232,2244,2256,2267],{},[37,2209,2210,2213,2216,2219],{},[55,2211,2212],{},"Embedding images in HTML",[55,2214,2215],{},"✅",[55,2217,2218],{},"❌",[55,2220,2218],{},[37,2222,2223,2226,2228,2230],{},[55,2224,2225],{},"Storing user passwords",[55,2227,2218],{},[55,2229,2215],{},[55,2231,2218],{},[37,2233,2234,2237,2240,2242],{},[55,2235,2236],{},"Sending data over HTTPS",[55,2238,2239],{},"Maybe*",[55,2241,2218],{},[55,2243,2218],{},[37,2245,2246,2249,2251,2253],{},[55,2247,2248],{},"Protecting API keys",[55,2250,2218],{},[55,2252,2218],{},[55,2254,2255],{},"✅ (server-side)",[37,2257,2258,2261,2263,2265],{},[55,2259,2260],{},"JWT payload (not secret)",[55,2262,2215],{},[55,2264,2218],{},[55,2266,2218],{},[37,2268,2269,2272,2274,2276],{},[55,2270,2271],{},"JWT signature (secret)",[55,2273,2218],{},[55,2275,2218],{},[55,2277,2215],{},[15,2279,2280],{},"*HTTPS already provides transport encryption. Base64 is for data format, not transport security.",[10,2282,2284],{"id":2283},"summary","Summary",[15,2286,2287],{},"Base64 encoding and encryption serve completely different purposes:",[273,2289,2290,2296,2301],{},[276,2291,2292,2295],{},[58,2293,2294],{},"Base64"," = Data format conversion (like translating languages)",[276,2297,2298,2300],{},[58,2299,48],{}," = Data protection (like putting in a safe)",[276,2302,2303,2306],{},[58,2304,2305],{},"Hashing"," = One-way transformation (for passwords)",[15,2308,2309],{},[58,2310,2311,2312,2315],{},"Remember: If you can decode it with ",[131,2313,2314],{},"atob()"," without a key, it's not encrypted!",[15,2317,2318],{},"Never use Base64 for:",[273,2320,2321,2324,2327,2330],{},[276,2322,2323],{},"Password storage",[276,2325,2326],{},"API key protection",[276,2328,2329],{},"Hiding sensitive data",[276,2331,2332],{},"Any security purpose",[10,2334,2336],{"id":2335},"related-tools","Related Tools",[273,2338,2339,2347],{},[276,2340,2341,2342],{},"Encode and decode Base64 with our ",[2343,2344,2346],"a",{"href":2345},"\u002Ftools\u002Fbase64","Base64 Encoder\u002FDecoder",[276,2348,2349,2350],{},"Generate strong passwords with our ",[2343,2351,2353],{"href":2352},"\u002Ftools\u002Fpassword-generator","Password Generator",[2355,2356,2357],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":133,"searchDepth":167,"depth":167,"links":2359},[2360,2361,2365,2369,2374,2379,2382,2387,2388,2389],{"id":12,"depth":167,"text":13},{"id":23,"depth":167,"text":24,"children":2362},[2363,2364],{"id":28,"depth":189,"text":29},{"id":121,"depth":189,"text":122},{"id":136,"depth":167,"text":137,"children":2366},[2367,2368],{"id":147,"depth":189,"text":148},{"id":263,"depth":189,"text":264},{"id":304,"depth":167,"text":305,"children":2370},[2371,2372,2373],{"id":308,"depth":189,"text":309},{"id":856,"depth":189,"text":857},{"id":908,"depth":189,"text":909},{"id":936,"depth":167,"text":937,"children":2375},[2376,2377,2378],{"id":940,"depth":189,"text":941},{"id":1065,"depth":189,"text":1066},{"id":1116,"depth":189,"text":1117},{"id":1192,"depth":167,"text":1193,"children":2380},[2381],{"id":1199,"depth":189,"text":1200},{"id":1378,"depth":167,"text":1379,"children":2383},[2384,2385,2386],{"id":1382,"depth":189,"text":1383},{"id":1542,"depth":189,"text":1543},{"id":1947,"depth":189,"text":1948},{"id":2186,"depth":167,"text":2187},{"id":2283,"depth":167,"text":2284},{"id":2335,"depth":167,"text":2336},"2026-05-26","Understand the fundamental difference between Base64 encoding and encryption. Learn why Base64 provides no security and how to properly protect sensitive data with AES, RSA, and hashing.","md",{"immutable":224},"\u002Fguides\u002Fbase64-vs-encryption",{"title":5,"description":2391},"guides\u002Fbase64-vs-encryption","J3Qm3ek2-IvSsM3L6X2Gs0Ht6e0HhbsS8deBO5f9iC4",1780401322698]