基础知识
数字签名 就是明文+私钥密文 这样就能保证数据没有被篡改
非对称加密 RSA、DSA
公钥、私钥
对称加密 DES、AES
只需要一个秘钥 加密解密 多用它就行了
密码散列算法有 SHA-1、SHA-256 、MD5
算出来就不可逆了,主要用来确定来源的
签名算法-SHA1withRSA
用SHA算法进行签名,用RSA算法进行加密
1 | $str = chunk_split($myPrivateKeyStr, 64, "\n"); |
RSA加密
1 | /** |
AES加密
openssl_encrypt($data,$method,$key,$options=0,$iv=””,&$tag=NULL,$aad=””,$tag_length=16)
1.$data:加密明文
2.$method:加密方法: 可以通过openssl_get_cipher_methods()获取有哪些加密方式
3.$passwd:加密密钥[密码]
4.$options:数据格式选项(可选)【选项有:】:0,OPENSSL_RAW_DATA=1,OPENSSL_ZERO_PADDING=2,OPENSSL_NO_PADDING=3
5.$iv:密初始化向量(可选),需要注意:如果method为DES−ECB,则iv无需填写
6.$tag:使用 AEAD 密码模式(GCM 或 CCM)时传引用的验证标签(可选)
7.$aad:附加的验证数据。(可选)
8.$tag_length:验证 tag 的长度。GCM 模式时,它的范围是 4 到 16(可选)
1 | openssl_encrypt(json_encode($body), 'AES-128-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv) |
DES加密
填充模式:pkcs5、pkcs7、iso10126、ansix923、zero。
加密模式:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。
ECB模式(电子密码本模式): 将明文分成块并分别加密,每个块独立处理。
相同的明文块将加密成相同的密文块,可能存在安全性问题。
CBC模式(密码块链接模式): 使用前一个块的密文与当前块的明文进行异或操作,增强了安全性。
需要一个初始化向量(IV)来加密第一个块。
CFB模式(密码反馈模式): 将前一个密文块与密钥流进行异或,再与明文进行异或。
这种模式使得每个密文块的加密都依赖于前一个密文块。
OFB模式(输出反馈模式): 将前一个输出块与密钥流进行异或,再与明文进行异或。
类似于CFB模式,但不同的是OFB不直接依赖前一个密文块
CTR模式(计数器模式): 使用一个计数器和密钥流进行异或,得到密文。
计数器的值会逐块增加,确保相同的明文块不会产生相同的密文块。
输出类型:无编码,base64编码,hex编码。
java 下默认是DES-ECB
HMAC 散列消息身份验证码
它不是散列函数,而是采用了将MD5或SHA1散列函数与共享机密秘钥(与公钥/秘钥对不同)一起使用的消息身份验证机制。
目前hmac主要应用在身份验证中,在用户登录传递密码的过程中可以利用,签名来防止密码明文传递。
在php中hash_hmac函数就能将HMAC和一部分哈希加密算法相结合起来实现HMAC-SHA1 HMAC-SHA256 HMAC-MD5等等算法
string hash_hmac(string $algo, string $data, string $key, bool $raw_output = false)
algo:要使用的哈希算法名称,可以是上述提到的md5,sha1等
data:要进行哈希运算的消息,也就是需要加密的明文。
key:使用HMAC生成信息摘要是所使用的密钥。
raw_output:该参数为可选参数,默认为false,如果设为true,则返回原始二进制数据表示的信息摘要,
否则返回16进制小写字符串格式表示的信息摘要(注意是16进制数,而非简单的字母加数字)。
1 |
|