ಅಥೆಂಟಿಕೇಶನ್ (Authentication) ಎಂಬುದು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ನ ಪ್ರವೇಶದ್ವಾರದಲ್ಲಿರುವ ಕಾವಲುಗಾರನಿದ್ದಂತೆ. ಯಾರಾದರೂ ಸೈನ್ ಅಪ್ ಅಥವಾ ಲಾಗ್ ಇನ್ ಆಗುವ ಪ್ರತಿ ಬಾರಿಯೂ, ಅವರು ತಾವು ಹೇಳಿಕೊಂಡ ವ್ಯಕ್ತಿಯೇ ಎಂದು ನಿಮ್ಮ ಸಿಸ್ಟಮ್ ನಿರ್ಧರಿಸಬೇಕಾಗುತ್ತದೆ. ಇದರಲ್ಲಿ ತಪ್ಪಾದರೆ, ನೀವು ಕೇವಲ ಫೇಲ್ ಆದ ಲಾಗಿನ್ ಅನ್ನು ಡಿಬಗ್ ಮಾಡುತ್ತಿಲ್ಲ; ಬದಲಾಗಿ ಬಳಕೆದಾರರ ನೈಜ ಡೇಟಾವನ್ನು ಕಳೆದುಕೊಳ್ಳುವ ಅಪಾಯವನ್ನು ಎದುರಿಸುತ್ತಿದ್ದೀರಿ. ಇದನ್ನು ಸರಿಯಾಗಿ ಮಾಡಲು ಎರಡು ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನಗಳು ಬೇಕು: ಡೇಟಾ ಸಂಗ್ರಹಣೆಯಲ್ಲಿರುವ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ರಕ್ಷಿಸಲು Bcrypt, ಮತ್ತು ಬಳಕೆದಾರರು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸುವಾಗ ಅವರ ಗುರುತನ್ನು ಪರಿಶೀಲಿಸಲು JSON Web Tokens.
ಪ್ಲೇನ್ಟೆಕ್ಸ್ (Plaintext) ಸಂಗ್ರಹಣೆ ಏಕೆ ವಿಫಲವಾಗುತ್ತದೆ
ಈ ಲೇಖನದಿಂದ ನೀವು ಕೇವಲ ಒಂದು ನಿಯಮವನ್ನು ಮಾತ್ರ ನೆನಪಿಟ್ಟುಕೊಳ್ಳುವುದಾದರೆ, ಅದು ಇದುವೇ ಆಗಿರಲಿ: ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಎಂದಿಗೂ ಪ್ಲೇನ್ಟೆಕ್ಸ್ ರೂಪದಲ್ಲಿ ಸಂಗ್ರಹಿಸಬೇಡಿ. ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ ಫೈರ್ವಾಲ್ನ ಹಿಂದೆ ಇದ್ದರೂ ಅಥವಾ ನಿಮ್ಮ ತಂಡದ ಪ್ರತಿಯೊಬ್ಬ ಎಂಜಿನಿಯರ್ ಮೇಲೆ ನಿಮಗೆ ನಂಬಿಕೆಯಿದ್ದರೂ ಇದು ಮುಖ್ಯವಲ್ಲ. ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಅವುಗಳ ಮೂಲ ರೂಪದಲ್ಲಿ ಟೇಬಲ್ಗಳಲ್ಲಿ ಬರೆಯುವುದು ಎಂದರೆ ಮನೆಯ ಕೀಲಿಗಳನ್ನು ಸ್ವಾಗತ ಮ್ಯಾಟ್ (welcome mat) ಅಡಿಯಲ್ಲಿ ಬಿಟ್ಟು ಹೋಗಿದಂತೆ. ತಪ್ಪಾಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾದ API, ಸೋರಿಕೆಯಾದ ಬ್ಯಾಕಪ್ ಅಥವಾ ಇಂಜೆಕ್ಷನ್ ಅಟ್ಯಾಕ್ ಮೂಲಕ ಯಾರಾದರೂ ಆ ಡೇಟಾಬೇಸ್ಗೆ ಪ್ರವೇಶ ಪಡೆದ ಕ್ಷಣವೇ, ಎಲ್ಲಾ ಕ್ರೆಡೆನ್ಶಿಯಲ್ಗಳು ತಕ್ಷಣವೇ ಬಹಿರಂಗಗೊಳ್ಳುತ್ತವೆ.
ಜನರು ಒಂದೇ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಮತ್ತೆ ಮತ್ತೆ ಬಳಸುವುದರಿಂದ ಹಾನಿಯು ಹೆಚ್ಚಾಗುತ್ತದೆ. ಒಂದು ಸಣ್ಣ ಸೋರಿಕೆಯು ಕೇವಲ ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಮಾತ್ರವಲ್ಲದೆ, ಬಳಕೆದಾರರ ಇಮೇಲ್, ಬ್ಯಾಂಕಿಂಗ್ ಮತ್ತು ಸೋಶಿಯಲ್ ಮೀಡಿಯಾ ಖಾತೆಗಳನ್ನು ಸಹ ಅಪಾಯಕ್ಕೆ ತಳ್ಳಬಹುದು. ಇದೇ ಕಾರಣಕ್ಕಾಗಿ ನಾವು ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಹ್ಯಾಶ್ (hash) ಮಾಡುತ್ತೇವೆ. ಹ್ಯಾಶಿಂಗ್ ಪ್ರಕ್ರಿಯೆಯು ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಮೂಲ ರೂಪಕ್ಕೆ ಯಾವುದೇ ಹೋಲಿಕೆಯಿಲ್ಲದ ಅಸ್ತವ್ಯಸ್ತವಾದ ಸ್ಟ್ರಿಂಗ್ ಆಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ. ಈ ಪ್ರಕ್ರಿಯೆಯು ಏಕಮುಖವಾಗಿದ್ದು (one-way), ಇದನ್ನು ಹಿಮ್ಮುಖವಾಗಿ ಮಾಡಲಾಗದು (irreversible). ನೀವು ಹ್ಯಾಶ್ ಮೇಲೆ ಗಣಿತದ ಆಮ್ಲವನ್ನು ಸುರಿದು ಅದನ್ನು ಮತ್ತೆ ಮೂಲ ಪಾಸ್ವರ್ಡ್ ಆಗಿ ಕರಗಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.
Bcrypt ಬಳಸಿ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಹ್ಯಾಶ್ ಮಾಡುವುದು
Bcrypt ಎಂಬುದು ವಿಶೇಷವಾಗಿ ಪಾಸ್ವರ್ಡ್ಗಳಿಗಾಗಿಯೇ ನಿರ್ಮಿಸಲಾದ ಹ್ಯಾಶಿಂಗ್ ಫಂಕ್ಷನ್ ಆಗಿದೆ. ಇದು ಪ್ಲೇನ್ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ತೆಗೆದುಕೊಂಡು, ಅದನ್ನು Blowfish cipher ಮೂಲಕ ರನ್ ಮಾಡಿ, $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy ನಂತಹ ಫಲಿತಾಂಶವನ್ನು ನೀಡುತ್ತದೆ. ಆ ಪ್ರಿಫಿಕ್ಸ್ (prefix) ನಿಮಗೆ ಅಲ್ಗಾರಿದಮ್ ಮತ್ತು ಕಾಸ್ಟ್ ಫ್ಯಾಕ್ಟರ್ (cost factor) ಅನ್ನು ತಿಳಿಸುತ್ತದೆ. ಉದ್ದವಾದ ಹಿಂಭಾಗವು ಸಾಲ್ಟ್ (salt) ಮತ್ತು ಹ್ಯಾಶ್ನ ಸಂಯೋಜನೆಯಾಗಿದೆ.
ಹ್ಯಾಶಿಂಗ್ ಪ್ರಾರಂಭವಾಗುವ ಮೊದಲು ಪಾಸ್ವರ್ಡ್ನೊಂದಿಗೆ ಬೆರೆಸಲಾದ ಯಾದೃಚ್ಛಿಕ ಡೇಟಾವೇ (random data) ಸಾಲ್ಟ್. ಪ್ರತಿ ಬಳಕೆದಾರರಿಗೂ ಸಾಲ್ಟ್ ವಿಭಿನ್ನವಾಗಿರುವುದರಿಂದ, ಇಬ್ಬರು ಬಳಕೆದಾರರು "password123" ಎಂಬ ಒಂದೇ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಆರಿಸಿಕೊಂಡರೂ, ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ಅವರಿಗೆ ಸಂಪೂರ್ಣವಾಗಿ ವಿಭಿನ್ನವಾದ ಹ್ಯಾಶ್ಗಳು ದೊರೆಯುತ್ತವೆ. ಈ ಸಣ್ಣ ವ್ಯತ್ಯಾಸವು ರೇನ್ಬೋ ಟೇಬಲ್ಗಳನ್ನು (rainbow tables—ಸಾಮಾನ್ಯ ಪಾಸ್ವರ್ಡ್ಗಳ ಹ್ಯಾಶ್ಗಳ ಮೊದಲೇ ಲೆಕ್ಕಹಾಕಿದ ಡಿಕ್ಷನರಿಗಳು) ಸೋಲಿಸುತ್ತದೆ—ಏಕೆಂದರೆ ದಾಳಿಕೋರರು ಪ್ರತಿಯೊಂದು ವಿಭಿನ್ನ ಸಾಲ್ಟ್ಗಾಗಿ ಇಡೀ ಟೇಬಲ್ ಅನ್ನು ಮತ್ತೆ ತಯಾರಿಸಬೇಕಾಗುತ್ತದೆ.
Bcrypt ಉದ್ದೇಶಪೂರ್ವಕವಾಗಿಯೇ ನಿಧಾನವಾಗಿದೆ. ಆಧುನಿಕ ಹಾರ್ಡ್ವೇರ್ಗಳು SHA-256 ನಂತಹ ವೇಗದ ಅಲ್ಗಾರಿದಮ್ಗಳೊಂದಿಗೆ ಪ್ರತಿ ಸೆಕೆಂಡಿಗೆ ಶತಕೋಟಿ ಹ್ಯಾಶ್ಗಳನ್ನು ಊಹಿಸಬಲ್ಲವು. ಆದರೆ Bcrypt ನಿಧಾನವಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ. ಇದು ಹ್ಯಾಶಿಂಗ್ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಹಲವಾರು ಬಾರಿ ನಡೆಸುತ್ತದೆ, ಇದನ್ನು ಕಾಸ್ಟ್ ಫ್ಯಾಕ್ಟರ್ ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗುತ್ತದೆ. ಕಂಪ್ಯೂಟರ್ಗಳು ವೇಗವಾಗುತ್ತಿದ್ದಂತೆ ನೀವು ಈ ಕಾಸ್ಟ್ ಫ್ಯಾಕ್ಟರ್ ಅನ್ನು ಹೆಚ್ಚಿಸಬಹುದು. ಈ ನಿಧಾನತೆಯು ಕಳುವಾದ ಡೇಟಾಬೇಸ್ ಮೂಲಕ ಬ್ರೂಟ್-ಫೋರ್ಸ್ (brute-force) ಮಾಡಲು ಪ್ರಯತ್ನಿಸುವವರಿಗೆ ತೊಂದರೆ ನೀಡುತ್ತದೆ. ಲಾಗ್ ಇನ್ ಮಾಡುವಾಗ ಹೆಚ್ಚುವರಿ ಇನ್ನೂರು ಮಿಲಿಸೆಕೆಂಡು ಕಾಯುವ ಸಾಮಾನ್ಯ ಬಳಕೆದಾರರಿಗೆ ಇದು ತಿಳಿಯುವುದಿಲ್ಲ. ಆದರೆ ಲಕ್ಷಾಂತರ ಊಹೆಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಪ್ರಯತ್ನಿಸುವ ದಾಳಿಕೋರರಿಗೆ ಇದು ಖಂಡಿತವಾಗಿಯೂ ಅಡ್ಡಿಯಾಗುತ್ತದೆ.
JSON Web Tokens ಹೇಗೆ ಕೆಲಸ ಮಾಡುತ್ತವೆ
Bcrypt ಪ್ರವೇಶದ್ವಾರವನ್ನು ನಿಭಾಯಿಸಿದರೆ, JWT ಬಳಕೆದಾರರ ಚಲನಶೀಲತೆಯನ್ನು (hallway pass) ನಿಭಾಯಿಸುತ್ತದೆ. ಒಂದು JSON Web Token ಎಂಬುದು ಬಳಕೆದಾರರು ಈಗಾಗಲೇ ಅಥೆಂಟಿಕೇಟ್ ಆಗಿದ್ದಾರೆ ಎಂದು ಸಾಬೀತುಪಡಿಸುವ ಸಂಕ್ಷಿಪ್ತವಾದ, URL-ಸುರಕ್ಷಿತ ಸ್ಟ್ರಿಂಗ್ ಆಗಿದೆ. ಇದನ್ನು ಸರ್ವರ್ ನೀಡುವ ಮತ್ತು ಕ್ಲೈಂಟ್ ಬಳಸುವ ಡಿಜಿಟಲ್ ಗುರುತಿನ ಚೀಟಿ ಎಂದು ಭಾವಿಸಿ.
ಒಂದು JWT ಮೂರು ಭಾಗಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ: ಹೆಡರ್ (header), ಪೇಲೋಡ್ (payload) ಮತ್ತು ಸಿಗ್ನೇಚರ್ (signature). ಇವುಗಳನ್ನು ಚುಕ್ಕೆಗಳಿಂದ (dots) ಪ್ರತ್ಯೇಕಿಸಲಾಗಿರುತ್ತದೆ. ಹೆಡರ್ ಟೋಕನ್ ಪ್ರಕಾರ ಮತ್ತು ಸೈನಿಂಗ್ ಅಲ್ಗಾರಿದಮ್ ಅನ್ನು ಸೂಚಿಸುತ್ತದೆ. ಪೇಲೋಡ್ ಬಳಕೆದಾರ ಮತ್ತು ಟೋಕನ್ ಬಗ್ಗೆ ಮಾಹಿತಿಗಳನ್ನು (claims)—ಉದಾಹರಣೆಗೆ ಬಳಕೆದಾರರ ಐಡಿ (user ID), ಬಳಕೆದಾರರ ಹೆಸರು (username) ಮತ್ತು ಅವಧಿ ಮುಕ್ತಾಯದ ಸಮಯ (expiration timestamp)—ಒಳಗೊಂಡಿರುತ್ತದೆ. ಸಿಗ್ನೇಚರ್ ಎಂಬುದು ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಸೀಲ್ ಆಗಿದೆ. ಸರ್ವರ್ ಹೆಡರ್ ಮತ್ತು ಪೇಲೋಡ್ ಅನ್ನು ಎನ್ಕೋಡ್ ಮಾಡಿ, ನಂತರ ಅವುಗಳನ್ನು ಸೀಕ್ರೆಟ್ ಕೀ ಮೂಲಕ ರನ್ ಮಾಡುವ ಮೂಲಕ ಇದನ್ನು ಸೃಷ್ಟಿಸುತ್ತದೆ. ಯಾರಾದರೂ ಪೇಲೋಡ್ ಅನ್ನು ಬದಲಾಯಿಸಲು ಪ್ರಯತ್ನಿಸಿದರೆ, ಸಿಗ್ನೇಚರ್ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ ಮತ್ತು ಸರ್ವರ್ ಆ ಟೋಕನ್ ಅನ್ನು ತಕ್ಷಣವೇ ತಿರಸ್ಕರಿಸುತ್ತದೆ.
