一、登录密码加密的测试
测试密码加密是验证加密算法是否正确的重要步骤。为了确保密码加密的正确性,可以使用加密库的自带函数来进行测试。
以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/n/151124.html