Authentication అనేది మీ అప్లికేషన్ తలుపు వద్ద ఉండే బౌన్సర్ వంటిది. ఎవరైనా సైన్ అప్ అయినప్పుడు లేదా లాగిన్ అయిన ప్రతిసారీ, వారు తాము చెప్పుకున్న వ్యక్తేనా కాదా అని మీ సిస్టమ్ నిర్ణయించాల్సి ఉంటుంది. ఇందులో పొరపాటు జరిగితే, మీరు కేవలం ఫెయిల్ అయిన లాగిన్ను డీబగ్ చేయడం మాత్రమే కాదు, వినియోగదారుల అసలు డేటా దొంగిలించబడే ప్రమాదంలో పడతారు. దీనిని సరిగ్గా చేయడానికి రెండు నమ్మకమైన సాధనాలు అవసరం: డేటాబేస్లో పాస్వర్డ్లను భద్రపరచడానికి Bcrypt, మరియు వినియోగదారుడు మీ యాప్లో తిరుగుతున్నప్పుడు వారి గుర్తింపును ధృవీకరించడానికి JSON Web Tokens.
Plaintext స్టోరేజ్ ఎందుకు విఫలమవుతుంది
ఈ వ్యాసం నుండి మీరు ఒకే ఒక నియమాన్ని గుర్తుంచుకోవాలనుకుంటే, అది ఇది: మీ డేటాబేస్లో పాస్వర్డ్లను ఎప్పుడూ plaintext రూపంలో నిల్వ చేయకండి. మీ డేటాబేస్ ఫైర్వాల్ వెనుక ఉన్నా లేదా మీ టీమ్లోని ప్రతి ఇంజనీర్ను మీరు నమ్మినా అది ముఖ్యం కాదు. పాస్వర్డ్లను వాటి అసలు రూపంలోనే టేబుల్స్లో రాయడం అనేది, ఇంటి తాళాలను వెల్కమ్ మ్యాట్ కింద వదిలిపెట్టినట్లు అవుతుంది. ఒక తప్పుగా కాన్ఫిగర్ చేయబడిన API, లీక్ అయిన బ్యాకప్ లేదా ఇంజెక్షన్ అటాక్ ద్వారా ఎవరైనా ఆ డేటాబేస్ను యాక్సెస్ చేసిన క్షణంలో, ప్రతి క్రెడెన్షియల్ వెంటనే బహిర్గతమవుతుంది.
ప్రజలు పాస్వర్డ్లను మళ్లీ మళ్లీ ఉపయోగిస్తారు కాబట్టి నష్టం మరింత పెరుగుతుంది. ఒకే ఒక్క బ్రీచ్ (breach) మీ అప్లికేషన్ను మాత్రమే కాకుండా, వినియోగదారుని ఈమెయిల్, బ్యాంకింగ్ మరియు సోషల్ మీడియా ఖాతాలను కూడా ప్రమాదంలో పడేస్తుంది. అందుకే మనం పాస్వర్డ్లను hash చేస్తాము. Hashing అనేది పాస్వర్డ్ను అసలు పాస్వర్డ్తో ఎటువంటి పోలిక లేని ఒక గందరగోళపు స్ట్రింగ్గా మారుస్తుంది. ఈ ప్రక్రియ వన్-వే (one-way) మరియు దీనిని వెనక్కి మార్చలేము (irreversible). మీరు ఒక hash మీద గణిత ఆమ్లాన్ని (mathematical acid) పోసి, దానిని తిరిగి అసలు పాస్వర్డ్గా మార్చలేరు.
Bcryptతో పాస్వర్డ్లను Hashing చేయడం
Bcrypt అనేది ప్రత్యేకంగా పాస్వర్డ్ల కోసం రూపొందించబడిన ఒక hashing function. ఇది ప్లెయిన్ స్ట్రింగ్ను తీసుకుని, దానిని Blowfish cipher ద్వారా రన్ చేసి, $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy లాంటి ఫలితాన్ని ఇస్తుంది. ఆ ప్రిఫిక్స్ (prefix) మీకు అల్గారిథమ్ మరియు cost factor గురించి చెబుతుంది. ఆ పొడవైన చివర salt మరియు hash యొక్క కలయిక.
Hashing ప్రారంభం కావడానికి ముందే పాస్వర్డ్లో కలిపే రాండమ్ డేటాను salt అంటారు. ప్రతి వినియోగదారునికి salt ప్రత్యేకంగా ఉండటం వల్ల, ఇద్దరు వ్యక్తులు "password123" అనే పాస్వర్డ్ను ఎంచుకున్నప్పటికీ, మీ డేటాబేస్లో వారికి పూర్తిగా భిన్నమైన hashes లభిస్తాయి. ఈ చిన్న తేడా వల్ల rainbow tables (సాధారణ పాస్వర్డ్ల కోసం ముందుగా లెక్కించిన hash డిక్షనరీలు) పనికిరావు—ఎందుకంటే దాడి చేసేవారు ప్రతి ప్రత్యేక salt కోసం మొత్తం టేబుల్ను మళ్లీ తయారు చేయాల్సి ఉంటుంది.
Bcrypt కావాలనే నెమ్మదిగా పనిచేసేలా రూపొందించబడింది. ఆధునిక హార్డ్వేర్ SHA-256 వంటి వేగవంతమైన అల్గారిథమ్లతో సెకనుకు బిలియన్ల కొద్దీ hashesలను ఊహించగలదు. కానీ Bcrypt మాత్రం నెమ్మదిగా సాగుతుంది. ఇది hashing ప్రక్రియను అనేకసార్లు రన్ చేస్తుంది, దీనిని ఒక cost factor నియంత్రిస్తుంది. కంప్యూటర్లు వేగవంతం అవుతున్న కొద్దీ మీరు ఈ cost factorను పెంచుకోవచ్చు. ఆ నెమ్మది వల్ల దొంగిలించబడిన డేటాబేస్ను brute-force ద్వారా ఛేదించడానికి ప్రయత్నించే వారికి ఇబ్బంది కలుగుతుంది. లాగిన్ సమయంలో అదనంగా రెండు వందల మిల్లీసెకన్లు వేచి ఉండే అసలైన వినియోగదారుడు దానిని గమనించడు. కానీ లక్షలాది ఊహలను (guesses) పరీక్షించడానికి ప్రయత్నించే దాడి చేసే వ్యక్తి ఖచ్చితంగా గమనిస్తాడు.
JSON Web Tokens ఎలా పనిచేస్తాయి
Bcrypt ముందు తలుపును చూసుకుంటే, JWT హాల్వే పాస్ (hallway pass) లాగా పనిచేస్తుంది. JSON Web Token అనేది వినియోగదారు ఇప్పటికే అథెంటికేట్ చేయబడ్డారని నిరూపించే ఒక కాంపాక్ట్, URL-safe స్ట్రింగ్. దీనిని సర్వర్ జారీ చేసే మరియు క్లయింట్ వెంట ఉంచుకునే ఒక డిజిటల్ ఐడి కార్డ్ లాగా భావించవచ్చు.
ఒక JWT లో చుక్కలతో (dots) వేరు చేయబడిన మూడు భాగాలు ఉంటాయి: header, payload, మరియు signature. Header అనేది టోకెన్ రకం మరియు సైనింగ్ అల్గారిథమ్ను తెలియజేస్తుంది. Payload లో claims ఉంటాయి—అంటే యూజర్ ఐడి, యూజర్ నేమ్ మరియు ఎక్స్పైరీ టైమ్స్టాంప్ వంటి వినియోగదారు మరియు టోకెన్ గురించి సమాచారం. Signature అనేది ఒక క్రిప్టోగ్రాఫిక్ సీల్ (cryptographic seal). సర్వర్ header మరియు payloadలను ఎన్కోడ్ చేసి, వాటిని ఒక సీక్రెట్ కీ ద్వారా రన్ చేయడం ద్వారా దీనిని సృష్టిస్తుంది. ఎవరైనా payloadతో छेड़छाड़ చేస్తే, signature సరిపోలదు మరియు సర్వర్ ఆ టోకెన్ను వెంటనే తిరస్కరిస్తుంది.
