一、登錄密碼加密的測試
測試密碼加密是驗證加密演算法是否正確的重要步驟。為了確保密碼加密的正確性,可以使用加密庫的自帶函數來進行測試。
以Node.js舉例,可以使用crypto模塊來測試加密演算法:
const crypto = require('crypto');
const password = '123456';
const salt = crypto.randomBytes(16).toString('hex');
const hash = crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('hex');
console.log('Salt:', salt);
console.log('Hash:', hash);
上述代碼使用了Node.js內置的crypto模塊,通過pbkdf2Sync演算法將密碼加密並輸出加密後的Hash值以及Salt值。
二、登錄密碼加密的傳輸
為了保證密碼在傳輸過程中的安全性,加密演算法需要支持用公鑰進行加密,在伺服器端使用私鑰進行解密。這裡可以使用OpenSSL庫來生成公鑰和私鑰。
生成私鑰:
openssl genrsa -out private.pem 2048
生成公鑰:
openssl rsa -in private.pem -pubout -out public.pem
在伺服器端加密密碼並使用私鑰解密:
const crypto = require('crypto');
const fs = require('fs');
const password = '123456';
const salt = crypto.randomBytes(16).toString('hex');
const privateKey = fs.readFileSync('private.pem');
const publicKey = fs.readFileSync('public.pem');
const encryptedPassword = crypto.publicEncrypt(publicKey, Buffer.from(password + salt));
const decryptedPassword = crypto.privateDecrypt(privateKey, encryptedPassword);
console.log('Salt:', salt);
console.log('Encrypted Password:', encryptedPassword.toString('hex'));
console.log('Decrypted Password:', decryptedPassword.toString());
上述代碼使用了crypto庫進行RSA加密,使用Buffer處理密碼加入Salt值後進行加密,最後使用私鑰進行解密。
三、前端登錄密碼加密
用戶的密碼在前端直接進行加密是有風險的,因為前端代碼可以被修改。為此,前端密碼加密需要使用公鑰進行加密,同時,在伺服器端需要使用私鑰進行解密。
在前端頁面引入CryptoJS庫進行加密:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js" integrity="sha512-nlZGu3xj7RbFl9T/AI4iKQ+UAbkWPLKKPqWMpL9FMumq1Vlcqy/mlqcB1sGgh8rTWnlH+PjAXv9L2kGcvdWXTA==" crossorigin="anonymous"></script>
在前端頁面使用公鑰對密碼進行加密:
const publicKey = '-----BEGIN PUBLIC KEY-----\n' +
'MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAn/4NB06nsxIxAdi4Zkfi\n' +
'rEVv1ZMdTTzoYaleBrXt+5yuTEe/d7JbLux7VrnwBzvBcKEOS5Mu6/3AWAFNBt3N\n' +
'Ksd4CkWjbG47nfrZVG+sKcfrmtztUv7jJRV+arquA2ukYAKsKZ9SZObhkHXRqNKa\n' +
'8Ug2fRs5rnAGKeAJS/4qT8PFMGqopflpj3as4XKUlljRzt8G9RQxYDAWGWXaUdBU\n' +
'z4/H+hYrhhN+bxQYa2meK4pfJMBiUWMHJz5jJpFLCN+8CfJ5E2a9y+8NtiKueQRX\n' +
'pnCcWZvGb5UE4llkMgW0cAain43poX2TXVflUz5nJp9R69zLYYTaze4sBu0GkAkc\n' +
'tas35ibCCub2Jt7E/DsDWoD5EvLY+9BddgrFRKbuoz3/SbsG6pQ3WoLXIK/1hbRh\n' +
'VbTUQ/sdrbU9gYCnJob2TIzX9RKmZuImB7nHJROExoMjnUjgAQ1GNaJkcuf69QOH\n' +
'8+G25Jmx/X/1JiGnzDiVCXa8vwh/+8OZStGJ/l9nCfLSS3N3ysBbJvF+AdZGpcJH\n' +
'xRfcjJCPB0+iIHvCF2CL5W/KEc2G0MrZL8x8pEpnDllzEh8YlZAYVZ0clGvAWp0u\n' +
'y7ijV+wRleQLdO+7P+uy+AEZcnLXPZ+OIH/X3ySPD0GzmW/cv20DLKfTT4VJ13ZF\n' +
'r9fBTNF0P4B9IWojGIVE3U0CAwEAAQ==\n' +
'-----END PUBLIC KEY-----\n';
const password = '123456';
const salt = 'iL+s5uM3NTWCcJhOGU1bbw==';
const encrypted = CryptoJS.AES.encrypt(password + salt, publicKey);
console.log('Encrypted Password:', encrypted.toString());
在伺服器端使用私鑰對密碼進行解密:
const crypto = require('crypto');
const fs = require('fs');
const privateKey = fs.readFileSync('private.pem');
const encryptedPassword = '1pPvj5ZjvJcAQwDmULHAuIdXJJb3yKsVcjCMzLeKFM8B+dUaPPwsCgghG5cmTN48PJN0/OmZnKSFw84m63p+Eg==';
const decryptedPassword = crypto.privateDecrypt(privateKey, Buffer.from(encryptedPassword, 'base64'));
console.log('Decrypted Password:', decryptedPassword.toString());
四、前端密碼加密方式
前端密碼加密的方式有多種,如MD5加密、SHA1加密、SHA256加密、AES加密等等。由於MD5、SHA1等常見加密方式已經被人們破解,因此推薦使用AES等更加安全的加密方式。
在前端頁面使用CryptoJS庫的AES加密:
const password = '123456';
const salt = 'iL+s5uM3NTWCcJhOGU1bbw==';
const key = CryptoJS.enc.Utf8.parse(salt);
const encrypted = CryptoJS.AES.encrypt(password, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
console.log('Encrypted Password:', encrypted.toString());
在伺服器端使用crypto模塊的AES解密:
const crypto = require('crypto');
const password = '123456';
const salt = 'iL+s5uM3NTWCcJhOGU1bbw==';
const key = Buffer.from(salt, 'base64');
const cipher = crypto.createDecipheriv('aes-256-ecb', key, '');
const decryptedPassword = Buffer.concat([cipher.update(Buffer.from(password, 'base64')), cipher.final()]);
console.log('Decrypted Password:', decryptedPassword.toString());
五、登錄密碼加密方式
登錄密碼加密的方式有多種,如MD5加鹽、SHA256加鹽、PBKDF2加鹽等等。其中,PBKDF2演算法是目前最為安全的密碼加密演算法之一,應用廣泛。
在伺服器端使用crypto模塊的PBKDF2演算法加密密碼:
const crypto = require('crypto');
const password = '123456';
const salt = crypto.randomBytes(16).toString('hex');
const iterations = 10000;
const keylen = 64;
const digest = 'sha512';
const hash = crypto.pbkdf2Sync(password, salt, iterations, keylen, digest).toString('hex');
console.log('Salt:', salt);
console.log('Hash:', hash);
在伺服器端使用PBKDF2演算法校驗密碼:
const crypto = require('crypto');
const password = '123456';
const salt = '13b80062ce7c77bfcca92fdea06ab312';
const iterations = 10000;
const keylen = 64;
const digest = 'sha512';
const hash = 'd23a70c521e860f96e3053e2bbad23a9822670c7579d5ec803fe16325c44187b5973880b0fbe0cfdefb9a6ebd90225aa68692e8049aa5f5a319edfae0a83896a';
const verifyHash = crypto.pbkdf2Sync(password, salt, iterations, keylen, digest).toString('hex');
if (hash === verifyHash) {
console.log('Password is correct');
} else {
console.log('Password is incorrect');
}
六、登錄密碼加密流程
登錄密碼加密的流程包括生成隨機鹽、密碼加鹽、使用哈希函數進行多次迭代,最後保存加鹽的哈希值和鹽值。
伺服器端使用crypto庫的PBKDF2演算法進行加密:
const crypto = require('crypto');
const password = '123456';
const salt = crypto.randomBytes(16).toString('hex');
const iterations = 10000;
const keylen = 64;
const digest = 'sha512';
const hash = crypto.pbkdf2Sync(password, salt, iterations, keylen, digest).toString('hex');
console.log('Salt:', salt);
console.log('Hash:', hash);
保存生成的salt和hash值後,可以將其存儲到資料庫中。在登錄驗證時,可以使用保存的salt和用戶輸入的密碼一起進行PBKDF2演算法加密,然後將結果與保存的hash值進行比對,以此來驗證用戶密碼的正確性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/151124.html
微信掃一掃
支付寶掃一掃