简介
Rsa是一种非对称加密算法,含有公钥和私钥。既可以使用公钥加密然后私钥解密,也可以使用私钥加密然后公钥解密,但后者的效率比前者慢100~1000倍。
特点:
1. 便于理解,使用广泛。
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
2. 缺点与不足:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。
应用场景
RSA用于保密性时,就是公钥加密,私钥解密。 因为公钥是可以公开了, 那么任何人都可以使用公钥对信息进行加密,但是只有持有私钥的人才能正确解密。这样就保证了信息的保密性,因为只有私钥持有者才能正确解密。
RSA用于认证性时,比如数字签名,即私钥持有者对信息进行签名,验证者可以根据公开的公钥进行验证签名是否正确和有效,即实现了认证性,以及不可抵赖性。
DES/AES加密速度快,适合大量数据,处理数据后可复原。
MD5用于完整性,确保信息在传输过程保持一致性;用于密码加密,数据库中不存储密码明文,而是存储其散列值,校验时比较散列值是否相同
组合使用
采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,使用散列函数进行数据摘要。
代码:
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;
@Slf4j
public class RsaUtils {
public final static String CHARSET_ENCODING = "UTF-8";
/**
* 编码
*
* @param password 密码的明文
* @param publicKey 公钥
* @return 返回加密后的密码(用于登陆)
*/
public static String encrypt(String password, String publicKey) {
try {
byte[] decode = Base64.decodeBase64(publicKey);
RSAPublicKey pk = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decode));
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pk);
return Base64.encodeBase64String(cipher.doFinal(password.getBytes(CHARSET_ENCODING)));
} catch (Exception e) {
log.error("加密失败", e);
}
return "";
}
public static void main(String[] args) {
//注意:这里是公钥的内容,去除了头(-----BEGIN PUBLIC KEY-----)和尾(-----END PUBLIC KEY-----)
String publicKey = "MIGfMXXXXXX....";
String password = "123456";
String encrypt = encrypt(password, publicKey);
System.out.println(encrypt);
}
}
说明:网上大部分RSA算法加密都是直接读文件流,然后处理的;直接通过密钥内容处理的情况比较少,所以进行记录。
仅测试验证的话,网上有线上加解密网站供使用。