ഓതന്റിക്കേഷൻ (Authentication) എന്നത് നിങ്ങളുടെ ആപ്ലിക്കേഷന്റെ വാതിലിലെ ഒരു സെക്യൂരിറ്റി ഗാർഡ് പോലെയാണ്. ആരെങ്കിലും സൈൻ അപ്പ് ചെയ്യുമ്പോഴോ ലോഗിൻ ചെയ്യുമ്പോഴോ, അവർ അവകാശപ്പെടുന്ന വ്യക്തി തന്നെയാണോ എന്ന് നിങ്ങളുടെ സിസ്റ്റം തീരുമാനിക്കേണ്ടതുണ്ട്. ഇതിൽ പിഴവ് സംഭവിച്ചാൽ, അത് വെറുമൊരു ലോഗിൻ പരാജയമായി മാറില്ല; മറിച്ച് യഥാർത്ഥ ഉപയോക്താക്കളുടെ ഡാറ്റ ചോരാൻ ഇടയാക്കും. ഇത് ശരിയായി ചെയ്യാൻ രണ്ട് വിശ്വസനീയമായ ടൂളുകൾ ആവശ്യമാണ്: പാസ്‌വേഡുകൾ സുരക്ഷിതമായി സൂക്ഷിക്കാൻ Bcrypt, ഉപയോക്താവ് ആപ്പിലൂടെ സഞ്ചരിക്കുമ്പോൾ അവരുടെ ഐഡന്റിറ്റി പരിശോധിക്കാൻ JSON Web Tokens.

പ്ലെയിൻ ടെക്സ്റ്റ് (Plaintext) സ്റ്റോറേജ് പരാജയപ്പെടുന്നത് എന്തുകൊണ്ട്?

ഈ ലേഖനത്തിൽ നിന്ന് ഒരു കാര്യം മാത്രം നിങ്ങൾ ഓർത്തുവെക്കുന്നുണ്ടെങ്കിൽ അത് ഇതാകണം: ഒരിക്കലും നിങ്ങളുടെ ഡാറ്റാബേസിൽ പാസ്‌വേഡുകൾ പ്ലെയിൻ ടെക്സ്റ്റ് ആയി സൂക്ഷിക്കരുത്. നിങ്ങളുടെ ഡാറ്റാബേസ് ഒരു ഫയർവാളിന് പിന്നിലാണെന്നോ ടീമിലെ എല്ലാ എഞ്ചിനീയർമാരെയും നിങ്ങൾ വിശ്വസിക്കുന്നുണ്ടെന്നോ ഉള്ളത് ഇതിനെ ബാധിക്കില്ല. പാസ്‌വേഡുകൾ അവയുടെ യഥാർത്ഥ രൂപത്തിൽ ടേബിളുകളിൽ എഴുതുന്നത് വീടിന്റെ താക്കോൽ വെൽക്കം മാറ്റ debajo വെക്കുന്നത് പോലെയാണ്. ഒരു തെറ്റായ കോൺഫിഗറേഷൻ ചെയ്ത API വഴിയോ, ചോർന്നുവന്ന ബാക്കപ്പ് വഴിയോ, അല്ലെങ്കിൽ ഒരു ഇൻജക്ഷൻ അറ്റാക്ക് (injection attack) വഴിയോ ആരെങ്കിലും ആ ഡാറ്റാബേസിൽ പ്രവേശിച്ചാൽ, എല്ലാ വിവരങ്ങളും ഉടൻ തന്നെ വെളിപ്പെടും.

ആളുകൾ ഒരേ പാസ്‌വേഡുകൾ പലയിടത്തും ഉപയോഗിക്കുന്നത് കാരണം ഇതിന്റെ ആഘാതം വർദ്ധിക്കുന്നു. ഒരു ചെറിയ സുരക്ഷാ വീഴ്ച നിങ്ങളുടെ ആപ്ലിക്കേഷനെ മാത്രമല്ല, ഉപയോക്താവിന്റെ ഇമെയിൽ, ബാങ്കിംഗ്, സോഷ്യൽ മീഡിയ അക്കൗണ്ടുകൾ എന്നിവയെയും അപകടത്തിലാക്കാം. അതുകൊണ്ടാണ് നമ്മൾ പാസ്‌വേഡുകൾ ഹാഷ് (hash) ചെയ്യുന്നത്. ഹാഷിംഗ് പാസ്‌വേഡിനെ അതിന്റെ യഥാർത്ഥ രൂപവുമായി യാതൊരു സാമ്യവുമില്ലാത്ത ഒരു സങ്കീർണ്ണമായ സ്ട്രിംഗായി മാറ്റുന്നു. ഈ പ്രക്രിയ ഏകദിശीयമാണ് (one-way), ഇത് തിരിച്ചെടുക്കാൻ കഴിയില്ല. ഒരു ഹാഷിന്മേൽ ഗണിതശാസ്ത്രപരമായ ആസിഡ് ഒഴിച്ചുകൊണ്ട് അതിനെ പഴയ പാസ്‌വേഡായി മാറ്റാൻ കഴിയില്ല.

Bcrypt ഉപയോഗിച്ച് പാസ്‌വേഡുകൾ ഹാഷ് ചെയ്യൽ

പാസ്‌വേഡുകൾക്കായി പ്രത്യേകം നിർമ്മിച്ച ഒരു ഹാഷിംഗ് ഫംഗ്ഷനാണ് Bcrypt. ഇത് പ്ലെയിൻ സ്ട്രിംഗെടുത്ത് Blowfish cipher വഴി കടത്തിവിട്ട് $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy എന്നതുപോലെയുള്ള ഒരു ഫലം നൽകുന്നു. ആ പ്രിഫിക്സ് (prefix) അൽഗോരിതത്തെയും കോസ്റ്റ് ഫാക്ടറിനെയും (cost factor) സൂചിപ്പിക്കുന്നു. ബാക്കിയുള്ള ഭാഗം സാൾട്ടും (salt) ഹാഷും ചേർന്നതാണ്.

ഹാഷിംഗ് തുടങ്ങുന്നതിന് മുമ്പ് പാസ്‌വേഡുമായി കൂട്ടിച്ചേർക്കുന്ന റാൻഡം ഡാറ്റയാണ് സാൾട്ട് (salt). ഓരോ ഉപയോക്താവിനും സാൾട്ട് വ്യത്യസ്തമായതുകൊണ്ട്, രണ്ടുപേരും "password123" എന്ന് പാസ്‌വേഡ് നൽകിയാലും നിങ്ങളുടെ ഡാറ്റാബേസിൽ അവർക്ക് ലഭിക്കുന്ന ഹാഷുകൾ തികച്ചും വ്യത്യസ്തമായിരിക്കും. ഈ ചെറിയ വ്യത്യാസം റെയിൻബോ ടേബിളുകളെ (rainbow tables—സാധാരണ പാസ്‌വേഡുകൾക്കായി മുൻകൂട്ടി തയ്യാറാക്കിയ ഹാഷ് ഡയറക്ടറികൾ) പരാജയപ്പെടുത്തുന്നു. കാരണം ഓരോ സാൾട്ടിനും വേണ്ടി അക്രമികൾക്ക് മുഴുവൻ ടേബിളും വീണ്ടും നിർമ്മിക്കേണ്ടി വരും.

Bcrypt മനഃപൂർവ്വം സാവധാനത്തിൽ പ്രവർത്തിക്കുന്ന രീതിയിലാണ് രൂപകൽപ്പന ചെയ്തിരിക്കുന്നത്. SHA-256 പോലുള്ള വേഗതയേറിയ അൽഗോരിതങ്ങൾ ഉപയോഗിച്ച് ആധുനിക ഹാർഡ്‌വെയറുകൾക്ക് സെക്കൻഡിൽ കോടിക്കണക്കിന് ഹാഷുകൾ ഊഹിച്ചെടുക്കാൻ കഴിയും. എന്നാൽ Bcrypt സാവധാനമേ പ്രവർത്തിക്കൂ. കമ്പ്യൂട്ടറുകൾ കൂടുതൽ വേഗതയുള്ളതാകുമ്പോൾ നിങ്ങൾക്ക് വർദ്ധിപ്പിക്കാവുന്ന ഒരു കോസ്റ്റ് ഫാക്ടർ ഉപയോഗിച്ച് ഇത് ഹാഷിംഗ് പ്രക്രിയ പലതവണ ആവർത്തിക്കുന്നു. മോഷ്ടിച്ച ഡാറ്റാബേസിലൂടെ ബ്രൂട്ട് ഫോഴ്സ് (brute-force) ആക്രമണം നടത്താൻ ശ്രമിക്കുന്നവരെ ഈ സാവധാനം തടയുന്നു. ലോഗിൻ ചെയ്യുമ്പോൾ അധികമായി ഇരുന്നൂറ് മില്ലിസെക്കൻഡ് കാത്തിരിക്കുന്ന ഒരു യഥാർത്ഥ ഉപയോക്താവ് അത് ശ്രദ്ധിക്കില്ല. എന്നാൽ ദശലക്ഷക്കണക്കിന് ഊഹങ്ങൾ പരീക്ഷിക്കാൻ ശ്രമിക്കുന്ന ഒരു അക്രമിക്കോ ഇത് വലിയ തടസ്സമാകും.

JSON Web Tokens എങ്ങനെ പ്രവർത്തിക്കുന്നു

Bcrypt പ്രധാന വാതിൽ കാത്തുസൂക്ഷിക്കുമ്പോൾ, JWT ഒരു പാസ്സ് (hallway pass) പോലെ പ്രവർത്തിക്കുന്നു. ഒരു ഉപയോക്താവ് ഇതിനകം ഓതന്റിക്കേറ്റ് ചെയ്യപ്പെട്ടു എന്ന് തെളിയിക്കുന്ന കംപാക്റ്റ് ആയ, URL-സുരക്ഷിതമായ ഒരു സ്ട്രിംഗാണ് JSON Web Token. സെർവർ നൽകുന്നതും ക്ലയന്റ് കൈവശം വെക്കുന്നതുമായ ഒരു ഡിജിറ്റൽ ഐഡി കാർഡ് ആയി ഇതിനെ കരുതാം.

ഒരു JWT-യിൽ ഡോട്ട് (.) ഉപയോഗിച്ച് വേർതിരിച്ച മൂന്ന് ഭാഗങ്ങളുണ്ട്: ഹെഡർ (header), പേലോഡ് (payload), സിഗ്നേച്ചർ (signature). ഹെഡർ ടോക്കൺ തരവും സൈനിംഗ് അൽഗോരിതവും വ്യക്തമാക്കുന്നു. പേലോഡ് ക്ലെയിമുകൾ (claims)—അതായത് ഉപയോക്താവിനെക്കുറിച്ചും ടോക്കണിനെക്കുറിച്ചുമുള്ള വിവരങ്ങൾ—വഹിക്കുന്നു. ഉദാഹരണത്തിന് യൂസർ ഐഡി, യൂസർ നെയിം, എക്സ്പയറി ടൈംസ്റ്റാമ്പ് എന്നിവ. സിഗ്നേച്ചർ എന്നത് ഒരു ക്രിപ്റ്റോഗ്രാഫിക് സീൽ ആണ്. ഹെഡറും പേലോഡും എൻകോഡ് ചെയ്ത ശേഷം ഒരു സീക്രട്ട് കീ ഉപയോഗിച്ച് പ്രവർത്തിപ്പിച്ചാണ് സെർവർ ഇത് നിർമ്മിക്കുന്നത്. ആരെങ്കിലും പേലോഡിൽ മാറ്റം വരുത്തിയാൽ സിഗ്നേച്ചർ മാച്ച് ആകില്ല, അപ്പോൾ സെർവർ ആ ടോക്കൺ നിരസിക്കും.