ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

系统密码加密

系统密码加密 1. 用户注册【用户输入的真实密码】User Real Password【加密逻辑】不是对称加密这是哈希摘要单向散列属于不可逆算法StringsaltIdUtil.simpleUUID();StringpasswordMd5Utils.encrypt(salt,user.getPassword());【数据库保存密码】823e23a32f46e534f92655873a5691412. 用户登录2.1. 生成随机公钥result.setAlgorithm(rsaKeyManager.getAlgorithm());result.setPublicKey(rsaKeyManager.getPublicKeyBase64());2.2 密码加密前端获取公钥对【用户输入的真实密码】进行加密对称的可以解密/** * 用公钥加密数据一般前端做这里为测试备用 */publicStringencrypt(Stringdata)throwsException{CiphercipherCipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE,keyPair.getPublic());byte[]encryptedBytescipher.doFinal(data.getBytes());returnBase64.getEncoder().encodeToString(encryptedBytes);}2.3 登录加密后的数据通过登录接口返回给后端“Ui3rnjeINs15u6nMWtwWfeunjpI51KsBawo3LBAM/y3rS9dKQ3U6KVMVYpGBXZmagz2fYWwUO85rK8uQ/8D5lE535mJIPHXkSNVEfofwsTfGJ4lmncSFq3cqybJoWCaU8Dge1mbB/bcLrDhcKCTJHUEhfNwdwcBAhN8QQZ2phCPW9qUlDperw8uJcNXmRos64N4rrJgOFaRXHc2U2pJFGP5OOWvqdk1qwFhaLgPBtIjgXzRjOWvUwC1JoKnCncg2lrR76/0OgDZyb3/uV/RXPBMXkssLf6m8n59KpEmbRMu1Nc4a30v4tpFfDI88USXMLgh6NNm10QMtpxmp9Q”2.4 解密还原为【用户输入的真实密码】登录接口解密逻辑Stringencrypted(String)value;// 解密并重新设置// 如果配置中有密钥从配置加载否则动态生成StringdecryptedrsaKeyManager.decrypt(encrypted);field.set(obj,decrypted);2.5 校验密码正确性解密后还需要校验密码其实就是在使用非对称加密算法计算结果与数据库的结果对比booleanisPassedMd5Utils.verify(user.getSalt(),password,user.getPassword());3. 工具方法3.1 Md5Utils非对称算法importcn.hutool.crypto.SecureUtil;publicclassMd5Utils{// 密码加密publicstaticStringencrypt(Stringsalt,Stringpassword){returnSecureUtil.md5(saltpassword);}// 密码匹配publicstaticBooleanverify(Stringsalt,Stringpassword,Stringciphertext){returnSecureUtil.md5(saltpassword).equals(ciphertext);}}3.2 RsaKeyManager对称算法importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;importjakarta.annotation.PostConstruct;importlombok.Data;importjava.security.KeyFactory;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;importjava.util.Base64;importjavax.crypto.Cipher;ComponentDatapublicclassRsaKeyManager{Value(${rsa.public-key:})privateStringpublicKeyConfig;Value(${rsa.private-key:})privateStringprivateKeyConfig;privateKeyPairkeyPair;privateStringpublicKeyBase64;privateStringprivateKeyBase64;privatestaticfinalStringALGORITHMRSA;publicStringgetAlgorithm(){returnALGORITHM;}PostConstructpublicvoidinit()throwsException{// 如果配置中有密钥从配置加载否则动态生成if(publicKeyConfig!null!publicKeyConfig.isEmpty()privateKeyConfig!null!privateKeyConfig.isEmpty()){loadFromConfig();}else{generateNewKeyPair();}}privatevoidloadFromConfig()throwsException{// 从配置加载KeyFactorykeyFactoryKeyFactory.getInstance(RSA);byte[]publicKeyBytesBase64.getDecoder().decode(publicKeyConfig);PublicKeypublicKeykeyFactory.generatePublic(newX509EncodedKeySpec(publicKeyBytes));byte[]privateKeyBytesBase64.getDecoder().decode(privateKeyConfig);PrivateKeyprivateKeykeyFactory.generatePrivate(newPKCS8EncodedKeySpec(privateKeyBytes));this.keyPairnewKeyPair(publicKey,privateKey);this.publicKeyBase64publicKeyConfig;this.privateKeyBase64privateKeyConfig;}privatevoidgenerateNewKeyPair()throwsException{KeyPairGeneratorgeneratorKeyPairGenerator.getInstance(RSA);generator.initialize(2048);this.keyPairgenerator.generateKeyPair();this.publicKeyBase64Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());this.privateKeyBase64Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());}/** * 用私钥解密数据 */publicStringdecrypt(StringencryptedData)throwsException{byte[]encryptedBytesBase64.getDecoder().decode(encryptedData);CiphercipherCipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE,keyPair.getPrivate());byte[]decryptedBytescipher.doFinal(encryptedBytes);returnnewString(decryptedBytes);}/** * 用公钥加密数据一般前端做这里为测试备用 */publicStringencrypt(Stringdata)throwsException{CiphercipherCipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE,keyPair.getPublic());byte[]encryptedBytescipher.doFinal(data.getBytes());returnBase64.getEncoder().encodeToString(encryptedBytes);}}
返回列表