加密,分两种,可逆和不可逆。
可逆,本质来说,就是将字符串通过异或或移位的方式。
第一是异或 用的是一种二进制的基本操作
第二是移位 将一个字母唯一地替换为另一个字母 比如后移动一位 把a换成b....z换成a
这两种可逆
还有是hash 不过不可逆
密钥。想一想,一段12345的文字,想要加密和不让对方知道,这时就要设置一个加密规则。比如将他转换成二进制 11000000111001 ,分隔二位进行一次异或,再转成文字。这个转成二进制的方式,就代表使用的加密的种类。比如用的aes,分隔二位则是 密钥 。
可逆分两类,对称加密和非对称加密,对称加密常用如下:
base64特征:
1.经过base64编码后的字符串长度一定会被4整除(包括后缀等号)
2.等号不超过两个。
aes, 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。对称加密算法也就是加密和解密用相同的密钥。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。
des,( Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。
3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。
RC2和RC4:( Rivest Cipher )对称算法,用变长密钥对大量数据进行加密,比 DES 快。 Rivest Cipher 4,也称为 ARC4 或 ARCFOUR,是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4 是有线等效加密(WEP)中采用的加密算法,也曾经是 TLS 可采用的算法之一,该算法的速度可以达到 DES 加密的 10 倍左右,且具有很高级别的非线性,虽然它在软件方面的简单性和速度非常出色,但在 RC4 中发现了多个漏洞,它特别容易受到攻击,RC4 作为一种老旧的验证和加密算法易于受到黑客攻击,现在逐渐不推荐使用了。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。
rabbit加密: Rabbit 加密算法是一个高性能的流密码加密方式,2003 年首次被提出,它从 128 位密钥和 64 位初始向量(iv)创建一个密钥流。 对比AES、DES、RC4、Rabbit、Triple DES、3DES 这些算法都可以引入密钥,他们密文特征与Base64类似,明显区别是秘文里+比较多,并且经常有/)。 变长类型,内容越多,加密出来的密文越长。且同样内容,同样密钥,每次加密后,密文不一致。密文前10位为U2FsdGVkX1,固定不变。
非对称加密如下:
常用的RSA,DSA,DH等。我们一般使用RSA ,TLS中 验证机制(非传输机制)一般也是用的RSA。
RSA, 由美国麻省理工学院三位学者 Rivest、Shamir 及Adleman 研究发展出 一套可实际使用的公开金钥密码系统,那就是RSA(Rivest-Shamir-Adleman)密码系统。 需要公钥和私钥。
DSA, DSA 只能用于数字签名,而无法用于加密(某些扩展可以支持加密);RSA 即可作为数字签名,也可以作为加密算法。不过作为加密使用的 RSA 有着随密钥长度增加,性能急剧下降的问题。
RSA 与 DSA 各有优缺点,那有没一个更好的选择呢?答案是肯定的,ECC(Elliptic Curves Cryptography):椭圆曲线算法。
ECC 与 RSA 相比,有以下的优点:
(1)相同密钥长度下,安全性能更高,如160位ECC已经与1024位RSA、DSA有相同的安全强度。
(2)计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。
(3)存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。
(4)带宽要求低使得ECC具有广泛得应用前景。
不可逆加密:
md5,sha1,sha256,hmacSha1,hmacsha224….hmacsha512
md5加密长度32位,16位即是32位的裁剪。 取中间的第 9 位到第 24 位的部分。 str.substring(8, 24);
sha1加密长度40位
sha224加密长度56位
sha256加密长度64位
sha384加密长度96位
sha512加密长度128位
hmacsha1 需要密钥。属于不可逆中加密的带密钥的。其加密后长度与sha一致。
//不需要密钥,直接内容加密。服务器拿到源文加密对比传过来的加密是否正确。
let md5=function(content){
let result = crypto.createHash('md5').update(content).digest("hex")
return result
}
let sha1=function (content){
return crypto.createHash('SHA1').update(content).digest('hex');
}
exports.sha256=function (content){
return crypto.createHash('SHA256').update(content).digest('hex');
}
hmacsha1 java代码
package com.hujl.oauth.signature;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class HMACSHA1 {
private static final String MAC_NAME = "HmacSHA1";
private static final String ENCODING = "UTF-8";
/*
* 展示了一个生成指定算法密钥的过程 初始化HMAC密钥
* @return
* @throws Exception
*
public static String initMacKey() throws Exception {
//得到一个 指定算法密钥的密钥生成器
KeyGenerator KeyGenerator keyGenerator =KeyGenerator.getInstance(MAC_NAME);
//生成一个密钥
SecretKey secretKey =keyGenerator.generateKey();
return null;
}
*/
/**
* 使用 HMAC-SHA1 签名方法对对encryptText进行签名
* @param encryptText 被签名的字符串
* @param encryptKey 密钥
* @return
* @throws Exception
*/
public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception
{
byte[] data=encryptKey.getBytes(ENCODING);
//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
//生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance(MAC_NAME);
//用给定密钥初始化 Mac 对象
mac.init(secretKey);
byte[] text = encryptText.getBytes(ENCODING);
//完成 Mac 操作
return mac.doFinal(text);
}
}
「爬虫知识」爬虫常见加密解密算法
https://baijiahao.baidu.com/s?id=1706700589435327561&wfr=spider&for=pc