在Javaweb项目中用MVC模式进行后端管理员RSA加密登录前后端具体代码实现,要求使用MySQL数据库,利用layUI框架和ajax接口请求
时间: 2023-05-27 07:05:28 浏览: 107
本回答仅提供MVC模式中后端管理员RSA加密登录的具体代码实现,不包括利用layUI框架和ajax接口请求的部分。
1. 数据库表结构设计
创建管理员表,包括用户名、密码、公钥和私钥四个字段。
CREATE TABLE `admin` (
`username` varchar(20) NOT NULL,
`password` varchar(255) NOT NULL,
`public_key` text NOT NULL,
`private_key` text NOT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. 后端代码实现
2.1. 生成RSA密钥对
在后端代码中,需要使用Java的RSA工具类生成公钥和私钥。这里使用了Bouncy Castle库中的RSA工具类。
import java.security.*;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class RSAUtils {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");
kpGen.initialize(1024);
return kpGen.generateKeyPair();
}
}
2.2. 将公钥和私钥存储到数据库中
在注册管理员时,需要先生成RSA密钥对,然后将公钥和私钥存储到数据库中。
public class AdminController {
private AdminService adminService = new AdminServiceImpl();
public Result register(String username, String password) {
try {
// 生成RSA密钥对
KeyPair keyPair = RSAUtils.generateKeyPair();
String publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
String privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
// 存储公钥和私钥到数据库中
Admin admin = new Admin(username, password, publicKey, privateKey);
adminService.register(admin);
return Result.success("注册成功");
} catch (Exception e) {
e.printStackTrace();
return Result.error("注册失败");
}
}
}
2.3. 登录时使用RSA加密密码
在登录时,前端需要将密码使用公钥进行RSA加密,后端则使用私钥进行RSA解密。
public class AdminController {
private AdminService adminService = new AdminServiceImpl();
public Result login(String username, String password) {
try {
// 获取管理员的私钥
Admin admin = adminService.getAdminByUsername(username);
String privateKeyStr = admin.getPrivateKey();
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyStr));
KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
// 使用私钥解密密码
byte[] decryptedPwd = RSAUtils.decrypt(password.getBytes(), privateKey);
String pwd = new String(decryptedPwd);
// 验证用户名和密码是否正确
if (adminService.verify(username, pwd)) {
return Result.success("登录成功");
} else {
return Result.error("用户名或密码错误");
}
} catch (Exception e) {
e.printStackTrace();
return Result.error("登录失败");
}
}
}
3. RSA加密解密工具类
最后,我们需要实现RSA加密解密的工具类。
import java.security.*;
import java.security.spec.*;
import javax.crypto.Cipher;
public class RSAUtils {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");
kpGen.initialize(1024);
return kpGen.generateKeyPair();
}
public static byte[] encrypt(byte[] data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
public static byte[] decrypt(byte[] data, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
}
至此,后端管理员RSA加密登录的具体代码实现已经完成。需要注意的是,本回答仅提供了后端代码实现,前端代码的实现方式可能因项目而异。
阅读全文