Authentication ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਦੇ ਦਰਵਾਜ਼ੇ 'ਤੇ ਇੱਕ ਬਾਊਂਸਰ ਵਾਂਗ ਹੈ। ਹਰ ਵਾਰ ਜਦੋਂ ਕੋਈ ਸਾਈਨ ਅੱਪ ਕਰਦਾ ਹੈ ਜਾਂ ਲੌਗਇਨ ਕਰਦਾ ਹੈ, ਤਾਂ ਤੁਹਾਡੇ ਸਿਸਟਮ ਨੂੰ ਇਹ ਫੈਸਲਾ ਕਰਨਾ ਪੈਂਦਾ ਹੈ ਕਿ ਕੀ ਉਹ ਉਹੀ ਹਨ ਜੋ ਉਹ ਦਾਅਵਾ ਕਰ ਰਹੇ ਹਨ। ਜੇਕਰ ਇਹ ਗਲਤ ਹੋ ਗਿਆ, ਤਾਂ ਤੁਸੀਂ ਸਿਰਫ਼ ਇੱਕ ਫੇਲ ਹੋਏ ਲੌਗਇਨ ਨੂੰ ਡੀਬੱਗ ਨਹੀਂ ਕਰ ਰਹੇ ਹੋ। ਤੁਸੀਂ ਅਸਲ ਯੂਜ਼ਰ ਡੇਟਾ ਦੇ ਸਿੱਧਾ ਬਾਹਰ ਜਾਣ ਦਾ ਖ਼ਤਰਾ ਮੁੱਲ ਲਗਾ ਰਹੇ ਹੋ। ਇਸ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਕਰਨ ਲਈ ਦੋ ਭਰੋਸੇਯੋਗ ਸਾਧਨਾਂ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ: ਪਾਸਵਰਡਾਂ ਦੀ ਸੁਰੱਖਿਆ ਲਈ Bcrypt, ਅਤੇ ਜਦੋਂ ਯੂਜ਼ਰ ਤੁਹਾਡੀ ਐਪ ਵਿੱਚ ਘੁੰਮਦਾ ਹੈ ਤਾਂ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ JSON Web Tokens।

ਪਲੇਨਟੈਕਸਟ (Plaintext) ਸਟੋਰੇਜ ਕਿਉਂ ਅਸਫਲ ਹੁੰਦੀ ਹੈ

ਜੇਕਰ ਤੁਸੀਂ ਇਸ ਲੇਖ ਵਿੱਚੋਂ ਸਿਰਫ਼ ਇੱਕ ਨਿਯਮ ਯਾਦ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਉਹ ਇਹ ਹੈ: ਆਪਣੇ ਡੇਟਾਬੇਸ ਵਿੱਚ ਪਾਸਵਰਡ ਕਦੇ ਵੀ ਪਲੇਨਟੈਕਸਟ ਵਜੋਂ ਸਟੋਰ ਨਾ ਕਰੋ। ਇਸ ਨਾਲ ਕੋਈ ਫਰਕ ਨਹੀਂ ਪੈਂਦਾ ਕਿ ਤੁਹਾਡਾ ਡੇਟਾਬੇਸ ਫਾਇਰਵਾਲ ਦੇ ਪਿੱਛੇ ਹੈ ਜਾਂ ਤੁਸੀਂ ਟੀਮ ਦੇ ਹਰ ਇੰਜੀਨੀਅਰ 'ਤੇ ਭਰੋਸਾ ਕਰਦੇ ਹੋ। ਪਾਸਵਰਡਾਂ ਨੂੰ ਉਹਨਾਂ ਦੇ ਕੱਚੇ ਰੂਪ ਵਿੱਚ ਟੇਬਲਾਂ ਵਿੱਚ ਲਿਖਣਾ ਘਰ ਦੀਆਂ ਚਾਬੀਆਂ ਨੂੰ ਵੈਲਕਮ ਮੈਟ (welcome mat) ਦੇ ਹੇਠਾਂ ਛੱਡਣ ਵਾਂਗ ਹੈ। ਜਿਸ ਪਲ ਕੋਈ ਉਸ ਡੇਟਾਬੇਸ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰ ਲੈਂਦਾ ਹੈ—ਕਿਸੇ ਗਲਤ ਤਰੀਕੇ ਨਾਲ ਕੌਂਫਿਗ ਕੀਤੇ API, ਲੀਕ ਹੋਏ ਬੈਕਅੱਪ, ਜਾਂ ਇੰਜੈਕਸ਼ਨ ਅਟੈਕ ਰਾਹੀਂ—ਹਰ ਕ੍ਰੈਡੈਂਸ਼ੀਅਲ ਤੁਰੰਤ ਪ੍ਰਗਟ ਹੋ ਜਾਂਦਾ ਹੈ।

ਨੁਕਸਾਨ ਇਸ ਲਈ ਵਧ ਜਾਂਦਾ ਹੈ ਕਿਉਂਕਿ ਲੋਕ ਪਾਸਵਰਡਾਂ ਦੀ ਦੁਬਾਰਾ ਵਰਤੋਂ ਕਰਦੇ ਹਨ। ਇੱਕ ਸਿੰਗਲ ਬ੍ਰੀਚ (breach) ਨਾ ਸਿਰਫ਼ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ, ਸਗੋਂ ਯੂਜ਼ਰ ਦੇ ਈਮੇਲ, ਬੈਂਕਿੰਗ ਅਤੇ ਸੋਸ਼ਲ ਮੀਡੀਆ ਖਾਤਿਆਂ ਨੂੰ ਵੀ ਖ਼ਤਰੇ ਵਿੱਚ ਪਾ ਸਕਦੀ ਹੈ। ਇਸੇ ਲਈ ਅਸੀਂ ਪਾਸਵਰਡਾਂ ਨੂੰ ਹੈਸ਼ (hash) ਕਰਦੇ ਹਾਂ। ਹੈਸ਼ਿੰਗ ਪਾਸਵਰਡ ਨੂੰ ਇੱਕ ਅਜਿਹੀ ਉਲਝੀ ਹੋਈ ਸਟ੍ਰਿੰਗ ਵਿੱਚ ਬਦਲ ਦਿੰਦਾ ਹੈ ਜੋ ਅਸਲ ਪਾਸਵਰਡ ਨਾਲ ਕੋਈ ਮਿਲਦਾ-ਜੁਲਦਾ ਨਹੀਂ ਹੁੰਦਾ। ਇਹ ਪ੍ਰਕਿਰਿਆ ਇੱਕ-ਤਰਫਾ ਅਤੇ ਅਣਰੱਦਯੋਗ (irreversible) ਹੈ। ਤੁਸੀਂ ਕਿਸੇ ਹੈਸ਼ 'ਤੇ ਗਣਿਤਿਕ ਐਸਿਡ (mathematical acid) ਪਾ ਕੇ ਉਸਨੂੰ ਵਾਪਸ ਉਸੇ ਪਾਸਵਰਡ ਵਿੱਚ ਨਹੀਂ ਘੋਲ ਸਕਦੇ ਜਿਸਨੇ ਉਸਨੂੰ ਬਣਾਇਆ ਸੀ।

Bcrypt ਨਾਲ ਪਾਸਵਰਡ ਹੈਸ਼ ਕਰਨਾ

Bcrypt ਇੱਕ ਹੈਸ਼ਿੰਗ ਫੰਕਸ਼ਨ ਹੈ ਜੋ ਖਾਸ ਤੌਰ 'ਤੇ ਪਾਸਵਰਡਾਂ ਲਈ ਬਣਾਇਆ ਗਿਆ ਹੈ। ਇਹ ਪਲੇਨ ਸਟ੍ਰਿੰਗ ਲੈਂਦਾ ਹੈ, ਇਸਨੂੰ Blowfish cipher ਰਾਹੀਂ ਚਲਾਉਂਦਾ ਹੈ, ਅਤੇ ਇੱਕ ਅਜਿਹਾ ਨਤੀਜਾ ਵਾਪਸ ਦਿੰਦਾ ਹੈ ਜੋ ਕੁਝ ਇਸ ਤਰ੍ਹਾਂ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ: $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy। ਉਹ ਪ੍ਰੀਫਿਕਸ (prefix) ਤੁਹਾਨੂੰ ਐਲਗੋਰਿਦਮ ਅਤੇ ਕਾਸਟ ਫੈਕਟਰ (cost factor) ਬਾਰੇ ਦੱਸਦਾ ਹੈ। ਲੰਬੀ ਪੂਛ (tail) ਸਾਲਟ (salt) ਅਤੇ ਹੈਸ਼ ਦਾ ਸੁਮੇਲ ਹੁੰਦੀ ਹੈ।

ਸਾਲਟ (salt) ਉਹ ਰੈਂਡਮ ਡੇਟਾ ਹੈ ਜੋ ਹੈਸ਼ਿੰਗ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਪਾਸਵਰਡ ਵਿੱਚ ਮਿਲਾ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ। ਕਿਉਂਕਿ ਹਰ ਯੂਜ਼ਰ ਲਈ ਸਾਲਟ ਵਿਲੱਖਣ ਹੁੰਦਾ ਹੈ, ਇਸ ਲਈ ਦੋ ਲੋਕ ਜੋ "password123" ਚੁਣਦੇ ਹਨ, ਉਹ ਤੁਹਾਡੇ ਡੇਟਾਬੇਸ ਵਿੱਚ ਬਿਲਕੁਲ ਵੱਖਰੇ ਹੈਸ਼ ਪ੍ਰਾਪਤ ਕਰਨਗੇ। ਇਹ ਮਾਮੂਲੀ ਅੰਤਰ ਰੇਨਬੋ ਟੇਬਲ (rainbow tables)—ਆਮ ਪਾਸਵਰਡਾਂ ਲਈ ਹੈਸ਼ਾਂ ਦੀਆਂ ਪਹਿਲਾਂ ਤੋਂ ਕੰਪਿਊਟ ਕੀਤੀਆਂ ਡਿਕਸ਼ਨਰੀਆਂ—ਨੂੰ ਹਰਾ ਦਿੰਦਾ ਹੈ—ਕਿਉਂਕਿ ਹਮਲਾਵਰਾਂ ਨੂੰ ਹਰ ਵਿਲੱਖਣ ਸਾਲਟ ਲਈ ਪੂਰੀ ਟੇਬਲ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਉਣ ਦੀ ਲੋੜ ਪਵੇਗੀ।

Bcrypt ਜਾਣਬੁੱਝ ਕੇ ਹੌਲੀ ਵੀ ਰੱਖਿਆ ਗਿਆ ਹੈ। ਆਧੁਨਿਕ ਹਾਰਡਵੇਅਰ SHA-256 ਵਰਗੇ ਤੇਜ਼ ਐਲਗੋਰਿਦਮਾਂ ਨਾਲ ਪ੍ਰਤੀ ਸੈਕਿੰਡ ਅਰਬਾਂ ਹੈਸ਼ਾਂ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾ ਸਕਦਾ ਹੈ। Bcrypt ਇਸ ਵਿੱਚ ਦੇਰੀ ਕਰਦਾ ਹੈ। ਇਹ ਹੈਸ਼ਿੰਗ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਕਈ ਵਾਰ ਚਲਾਉਂਦਾ ਹੈ, ਜਿਸ ਨੂੰ ਇੱਕ ਕਾਸਟ ਫੈਕਟਰ (cost factor) ਦੁਆਰਾ ਕੰਟਰੋਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਕੰਪਿਊਟਰਾਂ ਦੇ ਤੇਜ਼ ਹੋਣ ਦੇ ਨਾਲ ਵਧਾ ਸਕਦੇ ਹੋ। ਉਹ ਸੁਸਤੀ ਕਿਸੇ ਵੀ ਅਜਿਹੇ ਵਿਅਕਤੀ ਨੂੰ ਸਜ਼ਾ ਦਿੰਦੀ ਹੈ ਜੋ ਚੋਰੀ ਕੀਤੇ ਡੇਟਾਬੇਸ ਰਾਹੀਂ ਬ੍ਰੂਟ-ਫੋਰਸ (brute-force) ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ। ਲੌਗਇਨ ਦੌਰਾਨ ਵਾਧੂ ਦੋ ਸੌ ਮਿਲੀਸੈਕਿੰਡ ਇੰਤਜ਼ਾਰ ਕਰਨ ਵਾਲਾ ਇੱਕ ਜਾਇਜ਼ ਯੂਜ਼ਰ ਇਸਨੂੰ ਨੋਟ ਨਹੀਂ ਕਰੇਗਾ। ਪਰ ਲੱਖਾਂ ਅੰਦਾਜ਼ੇ ਲਗਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਵਾਲਾ ਹਮਲਾਵਰ ਜ਼ਰੂਰ ਨੋਟ ਕਰੇਗਾ।

JSON Web Tokens ਕਿਵੇਂ ਕੰਮ ਕਰਦੇ ਹਨ

ਜਦੋਂ Bcrypt ਮੁੱਖ ਦਰਵਾਜ਼ੇ ਨੂੰ ਸੰਭਾਲਦਾ ਹੈ, ਤਾਂ JWT ਹਾਲਵੇਅ (hallway) ਪਾਸ ਨੂੰ ਸੰਭਾਲਦਾ ਹੈ। ਇੱਕ JSON Web Token ਇੱਕ ਸੰਖੇਪ, URL-ਸੁਰੱਖਿਅਤ ਸਟ੍ਰਿੰਗ ਹੈ ਜੋ ਸਾਬਤ ਕਰਦੀ ਹੈ ਕਿ ਯੂਜ਼ਰ ਦੀ ਪਹਿਲਾਂ ਹੀ ਪ੍ਰਮਾਣਿਕਤਾ (authentication) ਕੀਤੀ ਜਾ ਚੁੱਕੀ ਹੈ। ਇਸਨੂੰ ਇੱਕ ਡਿਜੀਟਲ ID ਕਾਰਡ ਵਜੋਂ ਸਮਝੋ ਜੋ ਸਰਵਰ ਜਾਰੀ ਕਰਦਾ ਹੈ ਅਤੇ ਕਲਾਇੰਟ ਆਪਣੇ ਨਾਲ ਰੱਖਦਾ ਹੈ।

ਇੱਕ JWT ਵਿੱਚ ਤਿੰਨ ਹਿੱਸੇ ਹੁੰਦੇ ਹਨ ਜੋ ਡੌਟਸ (dots) ਦੁਆਰਾ ਵੱਖ ਕੀਤੇ ਗਏ ਹੁੰਦੇ ਹਨ: ਹੈਡਰ (header), ਪੇਲੋਡ (payload), ਅਤੇ ਸਿਗਨੇਚਰ (signature)। ਹੈਡਰ ਟੋਕਨ ਦੀ ਕਿਸਮ ਅਤੇ ਸਾਈਨਿੰਗ ਐਲਗੋਰਿਦਮ ਨੂੰ ਦੱਸਦਾ ਹੈ। ਪੇਲੋਡ ਵਿੱਚ ਕਲੇਮਜ਼ (claims) ਹੁੰਦੇ ਹਨ—ਯੂਜ਼ਰ ਅਤੇ ਖੁਦ ਟੋਕਨ ਬਾਰੇ ਬਿਆਨ—ਜਿਵੇਂ ਕਿ ਯੂਜ਼ਰ ID, ਯੂਜ਼ਰਨੇਮ, ਅਤੇ ਐਕਸਪਾਇਰੀ ਟਾਈਮਸਟੈਂਪ। ਸਿਗਨੇਚਰ ਇੱਕ ਕ੍ਰਿਪਟੋਗ੍ਰਾਫਿਕ ਸੀਲ ਹੈ। ਸਰਵਰ ਹੈਡਰ ਅਤੇ ਪੇਲੋਡ ਨੂੰ ਇਨਕੋਡ ਕਰਕੇ, ਫਿਰ ਉਹਨਾਂ ਨੂੰ ਇੱਕ ਗੁਪਤ ਕੀ (secret key) ਰਾਹੀਂ ਚਲਾ ਕੇ ਇਸਨੂੰ ਬਣਾਉਂਦਾ ਹੈ। ਜੇਕਰ ਕੋਈ ਪੇਲੋਡ ਨਾਲ ਛੇੜਛਾੜ ਕਰਦਾ ਹੈ, ਤਾਂ ਸਿਗਨੇਚਰ ਹੁਣ ਮੇਲ ਨਹੀਂ ਖਾਂਦਾ, ਅਤੇ ਸਰਵਰ ਟੋਕਨ ਨੂੰ ਸਿੱਧਾ ਰੱਦ ਕਰ ਦਿੰਦਾ ਹੈ।