一、登錄密碼加密的測試
測試密碼加密是驗證加密算法是否正確的重要步驟。為了確保密碼加密的正確性,可以使用加密庫的自帶函數來進行測試。
以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-hk/n/151124.html