ক্রিপ্টো ব্লক কি?
ক্রিপ্টো মডিউল হল Node.js-এ একটি অন্তর্নির্মিত মডিউল যা ক্রিপ্টোগ্রাফিক কার্যকারিতা প্রদান করে:
হ্যাশ ফাংশন
SHA-256, SHA-512, ইত্যাদি
HMAC
হ্যাশ-ভিত্তিক বার্তা প্রমাণীকরণ কোড
সিমেট্রিক এনক্রিপশন
AES, DES, ইত্যাদি
অসমমিতিক এনক্রিপশন
RSA, ECDSA, ইত্যাদি
ডিজিটাল স্বাক্ষর
যাচাইকরণ এবং নিশ্চিতকরণ
নিরাপদ র্যান্ডম সংখ্যা প্রজন্ম
র্যান্ডম ডেটা সুরক্ষিত করুন
ক্রিপ্টো মডিউলটি এমন অ্যাপ্লিকেশনগুলির জন্য প্রয়োজনীয় যেগুলিকে সংবেদনশীল তথ্য নিরাপদে পরিচালনা করতে হবে৷
ক্রিপ্টো মডিউলটি ওপেনএসএসএল লাইব্রেরিকে এনক্যাপসুলেট করে, সু-প্রতিষ্ঠিত এবং পরীক্ষিত ক্রিপ্টোগ্রাফিক অ্যালগরিদমগুলিতে অ্যাক্সেস প্রদান করে।
এই মডিউলটি সাধারণত সংবেদনশীল ডেটা পরিচালনা করতে ব্যবহৃত হয়, যেমন:
- ব্যবহারকারীর প্রমাণীকরণ এবং পাসওয়ার্ড স্টোরেজ
- নিরাপদ ডেটা স্থানান্তর
- ফাইল এনক্রিপশন এবং ডিক্রিপশন
- নিরাপদ যোগাযোগ চ্যানেল
ক্রিপ্টো দিয়ে শুরু করা
এখানে একটি স্ট্রিং হ্যাশ করার জন্য ক্রিপ্টো মডিউল ব্যবহার করার একটি দ্রুত উদাহরণ:
বেসিক হ্যাশিং উদাহরণ
const crypto = require('crypto');
// Create a SHA-256 hash of a string
const hash = crypto.createHash('sha256')
.update('Hello, Node.js!')
.digest('hex');
console.log('SHA-256 Hash:', hash);
ক্রিপ্টো মডিউল ইনস্টল করা হচ্ছে
ক্রিপ্টো মডিউলটি ডিফল্টরূপে Node.js-এ অন্তর্ভুক্ত থাকে।
আপনি এটি আপনার স্ক্রিপ্টে প্রয়োজন এবং এটি ব্যবহার করতে পারেন:
const crypto = require('crypto');
হ্যাশ ফাংশন
হ্যাশিং হ'ল অক্ষরগুলির একটি নির্দিষ্ট দৈর্ঘ্যের স্ট্রিংয়ে ডেটার একমুখী রূপান্তর।
হ্যাশ ফাংশনগুলির বেশ কয়েকটি গুরুত্বপূর্ণ বৈশিষ্ট্য রয়েছে:
সাধারণ ব্যবহারের ক্ষেত্রে:
- পাসওয়ার্ড স্টোরেজ
- ডেটা অখণ্ডতা পরীক্ষা
- ডিজিটাল স্বাক্ষর
- বিষয়বস্তুর ঠিকানা (যেমন, Git, IPFS)
হ্যাশ প্রজন্ম
const crypto = require('crypto');
// Create a hash object
const hash = crypto.createHash('sha256');
// Update the hash with data
hash.update('Hello, World!');
// Get the digest in hexadecimal format
const digest = hash.digest('hex');
console.log(digest);
এই উদাহরণে:
- createHash()- নির্দিষ্ট অ্যালগরিদম সহ একটি হ্যাশ অবজেক্ট তৈরি করে
- update()- প্রদত্ত ডেটা সহ হ্যাশ সামগ্রী আপডেট করে
- digest()- ডাইজেস্ট গণনা করে এবং এটি একটি নির্দিষ্ট বিন্যাসে আউটপুট করে
সাধারণ হ্যাশ অ্যালগরিদম
const crypto = require('crypto');
const data = 'Hello, World!';
// MD5 (not recommended for security-critical applications)
const md5 = crypto.createHash('md5').update(data).digest('hex');
console.log('MD5:', md5);
// SHA-1 (not recommended for security-critical applications)
const sha1 = crypto.createHash('sha1').update(data).digest('hex');
console.log('SHA-1:', sha1);
// SHA-256
const sha256 = crypto.createHash('sha256').update(data).digest('hex');
console.log('SHA-256:', sha256);
// SHA-512
const sha512 = crypto.createHash('sha512').update(data).digest('hex');
console.log('SHA-512:', sha512);
সতর্কতা:
MD5 এবং SHA-1 ক্রিপ্টোগ্রাফিকভাবে দুর্বল বলে মনে করা হয় এবং নিরাপত্তা-সমালোচনামূলক অ্যাপ্লিকেশনের জন্য ব্যবহার করা উচিত নয়।
পরিবর্তে SHA-256, SHA-384, বা SHA-512 ব্যবহার করুন৷
পাসওয়ার্ড সুরক্ষা
পাসওয়ার্ডের সাথে ডিল করার সময়, ব্রুট-ফোর্স আক্রমণ প্রতিরোধ করার জন্য গণনামূলকভাবে ব্যয়বহুল ডিজাইন করা বিশেষ পাসওয়ার্ড হ্যাশিং ফাংশন ব্যবহার করা গুরুত্বপূর্ণ।
কেন সহজ হ্যাশ যথেষ্ট নয়:
গুরুত্বপূর্ণ নোট:
MD5 বা SHA-1-এর মতো সাধারণ হ্যাশের সাহায্যে কখনই পাসওয়ার্ড জমা রাখবেন না।
রেইনবো টেবিল বা ব্রুট-ফোর্স অ্যাটাক ব্যবহার করে এগুলো সহজেই ভেঙ্গে যায়।
পাসওয়ার্ড নিরাপত্তার জন্য মূল ধারণা
লবণ কি?
একটি লবণ প্রতিটি ব্যবহারকারীর জন্য অনন্য একটি র্যান্ডম স্ট্রিং।
এটি হ্যাশ করার আগে পাসওয়ার্ডের সাথে সংযুক্ত করা হয়, যা নিশ্চিত করে যে দুই ব্যবহারকারীর একই পাসওয়ার্ড থাকলেও তাদের হ্যাশগুলি ভিন্ন হবে।
এটি একবারে একাধিক পাসওয়ার্ড ক্র্যাক করতে পূর্বনির্ধারিত টেবিল (যেমন রেইনবো টেবিল) ব্যবহারে বাধা দেয়।
const crypto = require('crypto');
// Function to hash a password
function hashPassword(password) {
// Generate a random salt (16 bytes)
const salt = crypto.randomBytes(16).toString('hex');
// Use scrypt for password hashing (recommended)
const hash = crypto.scryptSync(password, salt, 64).toString('hex');
// Return both salt and hash for storage
return { salt, hash };
}
// Function to verify a password
function verifyPassword(password, salt, hash) {
const hashedPassword = crypto.scryptSync(password, salt, 64).toString('hex');
return hashedPassword === hash;
}
// Example usage
const password = 'mySecurePassword';
// Hash the password for storage
const { salt, hash } = hashPassword(password);
console.log('Salt:', salt);
console.log('Hash:', hash);
// Verify a login attempt
const isValid = verifyPassword(password, salt, hash);
console.log('Password valid:', isValid); // true
const isInvalid = verifyPassword('wrongPassword', salt, hash);
console.log('Wrong password valid:', isInvalid); // false
দ্রষ্টব্য:
একটি উত্পাদন পরিবেশে পাসওয়ার্ড হ্যাশ করার জন্য, নিরাপদ পাসওয়ার্ড পরিচালনার জন্য বিশেষভাবে ডিজাইন করা একটি ডেডিকেটেড লাইব্রেরি ব্যবহার করার কথা বিবেচনা করুন, যেমন, bcrypt বা argon2।
HMAC (Hash-based Message Authentication Code)
HMAC হল একটি নির্দিষ্ট ধরনের বার্তা প্রমাণীকরণ কোড (MAC) যা একটি ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন এবং একটি গোপন ক্রিপ্টোগ্রাফিক কী নিয়ে গঠিত।
এটি ডেটা অখণ্ডতা এবং প্রমাণীকরণ উভয়ই প্রদান করে।
কখন HMAC ব্যবহার করবেন
- API অনুরোধ বৈধতা
- নিরাপদ কুকিজ এবং সেশন
- ডেটা অখণ্ডতা পরীক্ষা
- ওয়েবহুক যাচাইকরণ
HMAC নিরাপত্তা বৈশিষ্ট্য
const crypto = require('crypto');
// Secret key
const secretKey = 'mySecretKey';
// Create an HMAC
const hmac = crypto.createHmac('sha256', secretKey);
// Update with data
hmac.update('Hello, World!');
// Get the digest
const hmacDigest = hmac.digest('hex');
console.log('HMAC:', hmacDigest);
বার্তা যাচাইয়ের জন্য HMAC
const crypto = require('crypto');
// Function to create an HMAC for a message
function createSignature(message, key) {
const hmac = crypto.createHmac('sha256', key);
hmac.update(message);
return hmac.digest('hex');
}
// Function to verify a message's signature
function verifySignature(message, signature, key) {
const expectedSignature = createSignature(message, key);
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expectedSignature, 'hex')
);
}
// Example usage
const secretKey = 'verySecretKey';
const message = 'Important message to verify';
// Sender creates a signature
const signature = createSignature(message, secretKey);
console.log('Message:', message);
console.log('Signature:', signature);
// Receiver verifies the signature
try {
const isValid = verifySignature(message, signature, secretKey);
console.log('Signature valid:', isValid); // true
// Try with a tampered message
const isInvalid = verifySignature('Tampered message', signature, secretKey);
console.log('Tampered message valid:', isInvalid); // false
} catch (error) {
console.error('Verification error:', error.message);
}
দ্রষ্টব্য:
টাইমিং আক্রমণ প্রতিরোধ করার জন্য ক্রিপ্টোগ্রাফিক তুলনার জন্য সর্বদা timingSafeEqual() ব্যবহার করুন।
সিমেট্রিক এনক্রিপশন
সিমেট্রিক এনক্রিপশন এনক্রিপশন এবং ডিক্রিপশন উভয়ের জন্য একই কী ব্যবহার করে।
এটি সাধারণত অ্যাসিমেট্রিক এনক্রিপশনের চেয়ে দ্রুত এবং এর জন্য উপযুক্ত:
- মোট ডেটা এনক্রিপশন
- ডাটাবেস এনক্রিপশন
- ফাইল সিস্টেম এনক্রিপশন
- নিরাপদ মেসেজিং (কী বিনিময়ের সাথে মিলিত)
সাধারণ প্রতিসাম্য প্রক্রিয়া
| পদ্ধতি | বল আকার | আয়তনের আকার | নোট |
|---|---|---|---|
| AES-256 | 256 বিট | 128 বিট | বর্তমান মান ব্যাপকভাবে ব্যবহৃত হয় |
| ChaCha20 | 256 বিট | 512 বিট | সফ্টওয়্যারে দ্রুত, TLS 1.3 ব্যবহার করা হয় |
| 3DES | 168 বিট | 64 বিট | ঐতিহ্যগত, নতুন সিস্টেমের জন্য প্রস্তাবিত নয় |
| Blowfish | 32-448 বিট | 64 বিট | ঐতিহ্যগত, Twofish বা AES ব্যবহার করুন |
দ্রষ্টব্য:
উভয়ই প্রদান করার সময় সর্বদা স্বীকৃত এনক্রিপশন পদ্ধতি ব্যবহার করুন, যেমন, AES-GCM বা AES-CCM।
AES (Advanced Encryption Standard)
const crypto = require('crypto');
// Function to encrypt data
function encrypt(text, key) {
// Generate a random initialization vector
const iv = crypto.randomBytes(16);
// Create cipher with AES-256-CBC
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
// Encrypt the data
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
// Return both the encrypted data and the IV
return {
iv: iv.toString('hex'),
encryptedData: encrypted
};
}
// Function to decrypt data
function decrypt(encryptedData, iv, key) {
// Create decipher
const decipher = crypto.createDecipheriv(
'aes-256-cbc',
key,
Buffer.from(iv, 'hex')
);
// Decrypt the data
let decrypted = decipher.update(encryptedData, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
// Example usage
// Note: In a real application, use a properly generated and securely stored key
const key = crypto.scryptSync('secretPassword', 'salt', 32); // 32 bytes = 256 bits
const message = 'This is a secret message';
// Encrypt
const { iv, encryptedData } = encrypt(message, key);
console.log('Original:', message);
console.log('Encrypted:', encryptedData);
console.log('IV:', iv);
// Decrypt
const decrypted = decrypt(encryptedData, iv, key);
console.log('Decrypted:', decrypted);
সতর্কতা:
একই কী দিয়ে একই ইনিশিয়ালাইজেশন ভেক্টর (IV) পুনরায় ব্যবহার করবেন না।
প্রতিটি এনক্রিপশন অপারেশনের জন্য একটি নতুন র্যান্ডম IV তৈরি করুন।
অন্যান্য প্রতিসাম্য প্রক্রিয়া
ক্রিপ্টো মডিউল বিভিন্ন সিমেট্রিক এনক্রিপশন অ্যালগরিদম সমর্থন করে।
আসুন উপলব্ধ সাইফারগুলি দেখি:
const crypto = require('crypto');
// List available cipher algorithms
console.log(crypto.getCiphers());
অসমমিতিক এনক্রিপশন
অ্যাসিমেট্রিক এনক্রিপশন (পাবলিক-কী ক্রিপ্টোগ্রাফি) গাণিতিকভাবে সম্পর্কিত কীগুলির একটি জোড়া ব্যবহার করে:
সর্বজনীন কী
সর্বজনীনভাবে ভাগ করা যেতে পারে, এনক্রিপশনের জন্য ব্যবহার করা যেতে পারে
ব্যক্তিগত কী
গোপন রাখা হবে, এনক্রিপশনের জন্য ব্যবহার করা হবে
সাধারণ ব্যবহারের ক্ষেত্রে
- নিরাপদ কী বিনিময় (যেমন, TLS/SSL হ্যান্ডশেক)
- ডিজিটাল স্বাক্ষর
- ইমেল এনক্রিপশন (PGP/GPG)
- ব্লকচেইন এবং ক্রিপ্টোকারেন্সি
সাধারণ অপ্রতিসম প্রক্রিয়া
| পদ্ধতি | বল আকার | নিরাপত্তা স্তর | নোট |
|---|---|---|---|
| RSA | 2048+ বিট | উচ্চ | ব্যাপকভাবে ব্যবহৃত, ভাল সামঞ্জস্যপূর্ণ |
| ECDSA | 256-521 বিট | উচ্চ | বিটকয়েনে TLS 1.3 ব্যবহার করা হয় |
| Ed25519 | 256 বিট | অনেক উঁচুতে | আধুনিক, দক্ষ, SSH এ ব্যবহৃত |
কর্মক্ষমতা নোট:
অ্যাসিমেট্রিক এনক্রিপশন সিমেট্রিক এনক্রিপশনের তুলনায় অনেক ধীর।
প্রচুর পরিমাণে ডেটা এনক্রিপ্ট করতে, একটি হাইব্রিড পদ্ধতি ব্যবহার করুন:
- একটি র্যান্ডম সিমেট্রিক কী তৈরি করুন
- একটি সিমেট্রিক কী দিয়ে আপনার ডেটা এনক্রিপ্ট করুন
- প্রাপকের পাবলিক কী দিয়ে সিমেট্রিক কী এনক্রিপ্ট করুন
- এনক্রিপ্ট করা ডেটা এবং এনক্রিপ্ট করা কী উভয়ই পাঠান
RSA (Rivest-Shamir-Adleman)
const crypto = require('crypto');
// Generate RSA key pair
function generateKeyPair() {
return crypto.generateKeyPairSync('rsa', {
modulusLength: 2048, // Key size in bits
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem'
}
});
}
// Encrypt with public key
function encryptWithPublicKey(text, publicKey) {
const buffer = Buffer.from(text, 'utf8');
const encrypted = crypto.publicEncrypt(
{
key: publicKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
},
buffer
);
return encrypted.toString('base64');
}
// Decrypt with private key
function decryptWithPrivateKey(encryptedText, privateKey) {
const buffer = Buffer.from(encryptedText, 'base64');
const decrypted = crypto.privateDecrypt(
{
key: privateKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
},
buffer
);
return decrypted.toString('utf8');
}
// Generate keys
const { publicKey, privateKey } = generateKeyPair();
console.log('Public Key:', publicKey.substring(0, 50) + '...');
console.log('Private Key:', privateKey.substring(0, 50) + '...');
// Example usage
const message = 'This message is encrypted with RSA';
const encrypted = encryptWithPublicKey(message, publicKey);
console.log('Encrypted:', encrypted.substring(0, 50) + '...');
const decrypted = decryptWithPrivateKey(encrypted, privateKey);
console.log('Decrypted:', decrypted);
দ্রষ্টব্য:
RSA সাধারণত কর্মক্ষমতা সীমাবদ্ধতার কারণে অল্প পরিমাণে ডেটা (যেমন এনক্রিপশন কী) এনক্রিপ্ট করতে ব্যবহৃত হয়।
বড় ডেটার জন্য, একটি হাইব্রিড পদ্ধতি ব্যবহার করুন: একটি সিমেট্রিক অ্যালগরিদম (যেমন AES) দিয়ে ডেটা এনক্রিপ্ট করুন এবং RSA দিয়ে সিমেট্রিক কী এনক্রিপ্ট করুন।
ডিজিটাল স্বাক্ষর
ডিজিটাল স্বাক্ষরগুলি বার্তা, সফ্টওয়্যার বা ডিজিটাল নথিগুলির সত্যতা এবং অখণ্ডতা যাচাই করার একটি উপায় প্রদান করে৷
const crypto = require('crypto');
// Generate RSA key pair
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem'
}
});
// Function to sign a message
function signMessage(message, privateKey) {
const signer = crypto.createSign('sha256');
signer.update(message);
return signer.sign(privateKey, 'base64');
}
// Function to verify a signature
function verifySignature(message, signature, publicKey) {
const verifier = crypto.createVerify('sha256');
verifier.update(message);
return verifier.verify(publicKey, signature, 'base64');
}
// Example usage
const message = 'This message needs to be signed';
const signature = signMessage(message, privateKey);
console.log('Message:', message);
console.log('Signature:', signature.substring(0, 50) + '...');
// Verify the signature
const isValid = verifySignature(message, signature, publicKey);
console.log('Signature valid:', isValid); // true
// Verify with a modified message
const isInvalid = verifySignature('Modified message', signature, publicKey);
console.log('Modified message valid:', isInvalid); // false
র্যান্ডম ডেটা জেনারেশন
নিরাপদ র্যান্ডম ডেটা তৈরি করা অনেক ক্রিপ্টোগ্রাফিক ক্রিয়াকলাপের জন্য গুরুত্বপূর্ণ, যেমন কী, সল্ট এবং ইনিশিয়ালাইজেশন ভেক্টর তৈরি করা।
const crypto = require('crypto');
// Generate random bytes
const randomBytes = crypto.randomBytes(16);
console.log('Random bytes:', randomBytes.toString('hex'));
// Generate a random string (Base64)
const randomString = crypto.randomBytes(32).toString('base64');
console.log('Random string:', randomString);
// Generate a random number between 1 and 100
function secureRandomNumber(min, max) {
// Ensure we have enough randomness
const range = max - min + 1;
const bytesNeeded = Math.ceil(Math.log2(range) / 8);
const maxValue = 256 ** bytesNeeded;
// Generate random bytes and convert to a number
const randomBytes = crypto.randomBytes(bytesNeeded);
const randomValue = randomBytes.reduce((acc, byte, i) => {
return acc + byte * (256 ** i);
}, 0);
// Scale to our range and shift by min
return min + Math.floor((randomValue * range) / maxValue);
}
// Example: Generate 5 random numbers
for (let i = 0; i < 5; i++) {
console.log(`Random number ${i+1}:`, secureRandomNumber(1, 100));
}
নিরাপত্তা সেরা অনুশীলন
ক্রিপ্টো মডিউল ব্যবহার করার সময়, এই সেরা অনুশীলনগুলি মনে রাখবেন:
সতর্কতা:
ক্রিপ্টোগ্রাফি জটিল, এবং ভুলগুলি গুরুতর নিরাপত্তা দুর্বলতার দিকে নিয়ে যেতে পারে।
গুরুত্বপূর্ণ নিরাপত্তা বৈশিষ্ট্য বাস্তবায়ন করার সময়, একজন নিরাপত্তা বিশেষজ্ঞের সাথে পরামর্শ করুন বা নির্দিষ্ট ক্রিপ্টোগ্রাফিক কাজের জন্য ডিজাইন করা সু-প্রতিষ্ঠিত লাইব্রেরি ব্যবহার করার কথা বিবেচনা করুন।
সারাংশ
Node.js Crypto :
হ্যাশ ফাংশন
ডেটা ইন্টিগ্রেশন এবং ফিঙ্গারপ্রিন্টিং
HMAC
প্রমাণীকরণ এবং ইন্টিগ্রেশন পরীক্ষা
সিমেট্রিক এনক্রিপশন
শেয়ার্ড কী দিয়ে ডেটা সুরক্ষিত করা
অসমমিতিক এনক্রিপশন
নিরাপদ যোগাযোগ এবং ডিজিটাল স্বাক্ষর
র্যান্ডম ডেটা জেনারেশন
ক্রিপ্টোগ্রাফিক ফাংশন
ডিজিটাল স্বাক্ষর
সত্যতা যাচাই
এই ক্রিপ্টোগ্রাফিক ধারণাগুলি বুঝতে এবং সঠিকভাবে প্রয়োগ করে, আপনি সুরক্ষিত অ্যাপ্লিকেশন তৈরি করতে পারেন যা সংবেদনশীল ডেটা এবং যোগাযোগ রক্ষা করে।