| 程序包 | 说明 |
|---|---|
| cn.ponfee.commons.jce |
Java Cryptography Extension提供用于加密、密钥生成和协商
以及 Message Authentication Code(MAC)算法的实现
http://www.freebuf.com/articles/others-articles/136742.html
https://www.jianshu.com/p/b10a892879a0
1、密码:
你知道什么:口令(密码)、口令摘要、质询/响应
你有什么:认证令牌(质询/响应令牌、时间令牌),PIN双因素认证、SSL与认证令牌、智能卡
你是什么:生物特征认证,FAR(False Accept Ratio),FRR(False Reject Ratio)
2、对称加密:
优点:效率高
缺点:密钥成几何数增长、需要事先协商密钥
类型:分组密码(DES、3DES、AES),序列密码(RC4)、盐加密(PBE)
分组模式:ECB、CBC、OFB、CFB
填充:NoPadding, PKCS5Padding, PKCS7Padding, PADDING_ISO10126
AES要支持256位密钥:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
解压后替换jre/lib/security/目录下的jar文件即可
3、非对称加密:
优点:密钥分发安全,公开公钥即可
缺点:效率低
算法:
DH:基于离散对数的实现,主要用于密钥交换
RSA:基于大整数因式分解的实现,Ron [R]ivest, Adi [S]hamir, Leonard [A]dleman(三人)
https://www.kancloud.cn/kancloud/rsa_algorithm/48488
DSA:基于整数有限域离散对数难题(特点是两个素数公开),Digital Signature Algorithm,顾名思义只用于数字签名
ECC:基于椭圆曲线算法,指在取代RSA
填充:RSA_PKCS1_PADDING(blocklen=keysize/8–11)、RSA_PKCS1_OAEP_PADDING(keysize-41)、RSA_NO_PADDING
签名/验签:PKCS1及填充、PKCS7格式(附原文|不附原文)
PKCS: Public-Key Cryptography Standards
PKI: Public-Key Infrastructure
4、对称与非对称结合:数字信封envelop,结构体,(带签名|不带签名)
5、数字证书:ASN1、X509、p7b、p7r、p10、p12、PEM、DER等概念
6、BASE64编码:3个字节切分为4个字节后每字节最高位补00 0 ~ 63, “=”,并与编码表对照
前生:解决邮件只能发ASCII码问题
应用:二进制字节流数据文本化(某些场景的网络传输及文本表示)
7、哈希算法:指纹、摘要,用于防篡改等
MD5:前身MD2、MD3和MD4,安全性低,算法原理(填充、记录长度、数据处理)
SHA-1:已被严重质疑
SHA-2:SHA-224、SHA-256、SHA-384、SHA-512,算法跟SHA-1基本上仍然相似
SHA-3:之前名为Keccak算法,是一个加密杂凑算法
RIPEMD-160:哈希加密算法,用于替代128位哈希函数 MD4、MD5 和 RIPEMD
8、密码安全:BCrypt、SCrypt、PBKDF2, Argon2
9、时间戳、签章
10、区块链:
https://anders.com/blockchain,https://www.zhihu.com/question/22075219
SHA256:
block_header = version + previous_block_hash + merkle_root + time + target_bits + nonce
for i in range(0, 2^32):
if sha256(sha256(block_header)) < target_bits:
break
else:
continue
version:block的版本(静态常数)
previous_block_hash:上一个block的hash值(前一区块已经是打包好的)
merkle_root:需要写入的交易记录的hash树的值(根据本次交易包含的交易列表得到)
time:更新时间(utc时间:取打包时的时间,也不需要很精确,前后几十秒也都可以)
target_bits:当前难度
nonce:从0试到最大值2^32
target_bits:TARGET_MAX/difficulty,创世区块时的difficulty=1
TARGET_MAX=0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
https://www.liaoxuefeng.com/article/1124144362997184
┌─────────────────────────────────────────────┐
│Tx: abcd...1234 │
├─────────────────────┬───────────────────────┤
│ TxIn │ TxOut │
├─────────────┬───────┼──────┬────────────────┤
│prev hash │index │btc │pkScript │
├─────────────┼───────┼──────┼────────────────┤
│2016...a3c5 │3 │0.15 │OP_DUP a1b2... │<─┐
├─────────────┼───────┼──────┼────────────────┤ │
│2015...b6d8 │1 │0.08 │OP_DUP c3d4
|
| cn.ponfee.commons.jce.digest | |
| cn.ponfee.commons.jce.implementation.rsa |
RSA implementation
|
| 限定符和类型 | 方法和说明 |
|---|---|
static DigestAlgorithms |
DigestAlgorithms.valueOf(String name)
返回带有指定名称的该类型的枚举常量。
|
static DigestAlgorithms[] |
DigestAlgorithms.values()
按照声明该枚举类型的常量的顺序, 返回
包含这些常量的数组。
|
| 限定符和类型 | 方法和说明 |
|---|---|
static byte[] |
DigestUtils.digest(DigestAlgorithms alg,
byte[] input) |
static byte[] |
DigestUtils.digest(DigestAlgorithms alg,
byte[] input,
byte[]... data) |
static byte[] |
DigestUtils.digest(DigestAlgorithms alg,
InputStream input) |
static byte[] |
DigestUtils.digest(DigestAlgorithms alg,
Provider provider,
byte[] input) |
static byte[] |
DigestUtils.digest(DigestAlgorithms alg,
Provider provider,
byte[] input,
byte[]... data)
数据摘要
|
static byte[] |
DigestUtils.digest(DigestAlgorithms alg,
Provider provider,
InputStream input)
数据摘要
|
static MessageDigest |
DigestUtils.getMessageDigest(DigestAlgorithms alg,
Provider provider) |
| 限定符和类型 | 方法和说明 |
|---|---|
byte[] |
RSASigner.sign(byte[] data,
DigestAlgorithms alg) |
boolean |
RSASigner.verify(byte[] data,
byte[] signature,
DigestAlgorithms alg) |
Copyright © 2023. All rights reserved.