本项目采用RAS算法在前端进行数据加密,并通过Java后端解密,同时兼容JavaScript环境,确保数据的安全传输。
实现前端使用jsencrypt进行非对称加密,并在后端用Java解密,然后通过MD5算法完成登录验证。以下是相关代码示例及详细解释。
1. **前端部分**:使用JS中的`jsencrypt.js`库生成公钥和私钥,并利用公钥对敏感信息(如密码)进行非对称加密。
```javascript
// 引入 jsencrypt 库文件
function encryptData(publicKey, dataToEncrypt) {
var encrypted = new JSEncrypt();
encrypted.setPublicKey(publicKey);
return encrypted.encrypt(dataToEncrypt);
}
// 使用示例,假设publicKey和password为已定义变量
let encryptedPassword = encryptData(publicKey, password);
```
2. **后端部分**:使用Java的BouncyCastle库来解析前端传递过来的加密数据,并利用私钥进行解密。
```java
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class DecryptService {
private static final String PROVIDER_NAME = BC;
// 初始化 Bouncy Castle 提供者
static { Security.addProvider(new BouncyCastleProvider()); }
public String decryptData(String privateKey, String encryptedMessage) throws Exception {
java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
KeyFactory kf = KeyFactory.getInstance(RSA, PROVIDER_NAME);
PrivateKey privkey = kf.generatePrivate(keySpec);
Cipher ciph = Cipher.getInstance(RSA/ECB/PKCS1Padding);
// 解密数据
byte[] encryptedDataBytes = Base64.decode(encryptedMessage);
ciph.init(Cipher.DECRYPT_MODE, privkey);
byte[] decryptedDataBytes = ciph.doFinal(encryptedDataBytes);
return new String(decryptedDataBytes);
}
}
// 使用示例
DecryptService service = new DecryptService();
String originalPassword = service.decryptData(privateKey, encryptedMessageFromFrontend);
```
3. **MD5登录验证**:在获取到原始数据后,使用Java的`MessageDigest`类生成MD5哈希值进行比对。
```java
public class LoginValidator {
public boolean validateUser(String password) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance(MD5);
byte[] messageDigest = md.digest(password.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
String h = Integer.toHexString(0xFF & b);
while(h.length() < 2)
h = 0 + h;
hexString.append(h);
}
// 假设数据库中存储的MD5密码为 storedPassword
return storedPassword.equals(hexString.toString());
}
}
// 使用示例
LoginValidator validator = new LoginValidator();
boolean isValidUser = validator.validateUser(originalPasswordFromDecryption);
```
以上步骤展示了如何在前端使用非对称加密算法保护敏感数据,并通过Java后端进行解密,最后利用MD5哈希值验证用户登录信息。