https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html
Java加密体系(Java Cryptography Architecture,JCA)是Java平台的一部分,它提供了一套用于加密、密钥生成和管理的API。JCA的设计目标是能够插入不同的加密服务提供者(Cryptography Service Providers,CSP),使得Java应用程序能够在各种加密算法和协议中灵活选择。
JCA的主要组件包括:
JCA还支持加密算法的参数设置,如密钥大小、迭代次数等,通过AlgorithmParameterSpec接口及其子类实现。
Java加密体系(JCA)支持多种加密算法,包括对称加密、非对称加密、哈希(散列)算法和数字签名算法。JCA支持的常见加密算法:
对称加密算法:
非对称加密算法:
哈希(散列)算法:
数字签名算法:
这些算法可以用于各种加密操作,如数据加密、密钥交换、哈希生成和数字签名。JCA通过Cipher类、Signature类、MessageDigest类等提供了对这些算法的支持。
随着加密技术的发展和安全性的变化,一些算法(如MD5和SHA-1)由于已不再被认为是安全的,因此在某些情况下可能不再推荐使用。
Demo示例
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class JCACryptoExample {
public static void main(String[] args) throws Exception {
// 生成AES密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 设置密钥大小为128位
SecretKey secretKey = keyGenerator.generateKey();
// 加密数据
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
String plainText = "This is a secret message!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
String encryptedBase64 = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Encrypted (Base64): " + encryptedBase64);
// 解密数据
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedBase64));
String decryptedText = new String(decryptedBytes);
System.out.println("Decrypted: " + decryptedText);
}
}
首先使用KeyGenerator生成一个AES密钥。然后,我们创建一个Cipher实例来初始化加密模式,并使用生成的密钥对字符串进行加密。加密后的数据被转换为Base64编码的字符串以便于显示。接着,我们重新初始化Cipher以解密模式,并使用相同的密钥对加密后的数据进行解密,最后将解密后的数据转换回原始字符串
| 名称 | 描述 | GitHub |
|---|---|---|
| crypto-js | MD5、SHA1、SHA2、SHA3、RIPEMD-160 的哈希散列,AES、DES、Rabbit、RC4、Triple DES 对称加解密 | https://github.com/brix/crypto-js |
| JSEncrypt | 非对称RSA加解密,只支持浏览器,不支持Node | https://github.com/travist/jsencrypt |
| node-rsa | 支持Node运行的RSA加解密库 | https://github.com/rzcoder/node-rsa |
| Web Cryptography API | W3C制定的密码规范API,主流浏览器、Node15都已支持 | https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API |
| opensm | 开源国密SM2/SM3/SM4算法,基于GmSSL,基于OpenSSL1.1.0,7年前(老) | https://github.com/zhangyantao/opensm |
| TencentKonaSMSuite | 腾讯开源的国密套件SDK(Java) | https://github.com/tencent/TencentKonaSMSuite |
| sm-crypto | 国密算法sm2、sm3和sm4的JavaScript实现,有关联java版 | https://github.com/JuneAndGreen/sm-crypto |
| gm-crypto | 国密算法sm2、sm3和sm4的JavaScript实现 | https://github.com/byte-fe/gm-crypto |
| sm-crypto-v2 | 国密算法 sm2、sm3 和 sm4 的 JavaScript 实现 | https://github.com/Cubelrti/sm-crypto-v2 |
| GmSSL | 北京大学国密开源库,包含多个版本Java、JS、PHP、Go…,没有npm包 | https://github.com/guanzhi/GmSSL |
| Tongsuo 铜锁 | 阿里开源的综合性基础密码库,功能比较全 | https://github.com/Tongsuo-Project/Tongsuo |

国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,在一般信息化系统开发中主要使用公开的SM2(非对称)、SM3(摘要)、SM4(对称)三类算法。
Base64是一种编码格式,并不属于加密,常用于数据传输、兼容性问题。Base64编码本质上是一种将二进制数据转成文本数据的方案,将一些不适合传输的数据内容进行编码来适合传输。
🔸基本特点:
🔸应用场景:
🔸基本特点:
🔸应用场景:
🔸基本特点:
🔸应用场景:
🔸彩虹表破解:
由于散列算法的特点(同一数据生成哈希值始终一样),如果存储了大量(海量)字符内容的哈希值,就很容易进行查询破解了,这就是彩虹表,暴力破解也是一样的道理。常用的6位数字密码是相当容易破解的,如CMD5这个网站就利用存储的大量密文字典,反向查询破解。怎么解决呢?
提升散列算法的安全性,常用方法就是加“盐”,核心思想就是在哈希过程中添加一些自定义的内容、规则,仅自己知道,从而避免被字典破解。
最简单的比如在密文中某一位置添加一串随机字符,只有自己知道,使用的时候去掉干扰字符即可。
加盐的具体方式很多,可以自己DIV,常用的一种模式如下图,加盐+双重哈希。 MD5(MD5(password) + salt)
如果加盐的规则被窃取了,对于现代的硬件是挺容易被破解的,只能设置尽量复杂的密码+定期更换了。
📢实际应用中,可能会多种加密算法组合使用。
比如HTTPS的安全数据传输就是同时用了对称加密、非对称加密,用非对称传送(动态)密钥,对称加密传输数据。 《HTTP协议图文简述》
对一个数据进行多重加密,以防被破解
https://www.metools.info/code/c80.html
RSA非对称加密公私钥对生成,输出PEM格式的公私钥对,同时支持PKCS#1、PKCS#8密钥格式输出;生成的公私钥对,可拷贝到文本文件,保存为.key文件即可使用。
PEM格式:RSA公私钥对常用的编码方式,OPENSSL以PEM格式为主,相对DER可读性更强,以BASE64编码呈现;
开头类似 -----BEGIN PRIVATE KEY-----
结尾类似 -----END PRIVATE KEY-----
PKCS#8密钥格式,多用于JAVA、PHP程序加解密中,为目前用的比较多的密钥、证书格式;
PKCS#1密钥格式,多用于JS等其它程序加解密,属于比较老的格式标准。
PKCS#1和PKCS#8的主要区别,从本质上说,PKCS#8格式增加验证数据段,保证密钥正确性。
国密SSL实验室
国家密码管理局-密码规范
前端加密·国密算法
一文读懂“密评”实施流程
