Java编码与加密

字数 1890阅读 2

URL编码

URL编码时浏览器发送数据给服务器时使用的编码。

编码规则

  • A-Z, a-z, 0-9 以及 -_.* 保持不变

  • 空格用%20表示

  • 其它字符用%XX表示

    • < : %3C
    • 中: %E4%B8%AD(UTF8: 0xe4b8ad)

目的

URL编码的目的是把任意的文本编码为%前缀的文本,编码后的文本仅包含A-Z, a-z, 0-9, -_.*, %,为了便于浏览器和服务器的处理。

Base64

Base64编码是一种把二进制数据用文本表示的编码算法。

编码规则

  1. 把3个字符用字节表示(24 bits)拆分成4份,每份前面补0,变成4个字节。

转换前 11111111, 11111111, 11111111 (二进制)

转换后 <font color="red">00</font>111111, <font color="red">00</font>111111, <font color="red">00</font>111111, <font color="red">00</font>111111 (二进制)

  1. 每76个字符加一个换行符

  2. 如果字节数不是3的整数倍,末尾补0x00(=)或0x00 0x00,所以会看到很多经过Base64编码的字符串末尾会出现=号或==号。

Tips:

  1. 如果希望编码后去掉=号,可以使用Base64.getEncoder().withoutPadding(),实际上末尾有没有=号,对解码没有影响
  2. 如果经过Base64编码需要在URL中传输,可以使用Base64.getUrlEncoder(),这样做的结果是把+号变成-,把/变成_,这样就能够在URL中进行传输了
  3. 任意二进制数据经过Base64编码长度会增加1/3
  4. 其它编码:Base32,Base48,Base58

目的

是一中用文本表示二进制数据的方式,适用于文本协议。

  • 缺点:效率下降(长度增加1/3)
  • 应用:电子邮件协议

MD5

MD5(MD5 Message-Digest Algorithm)是一种摘要算法又称为Hash算法、散列算法、数字指纹。

特点

  • 计算任意长度数据的摘要(固定长度)
  • 相同的输入始终得到相同的输出
  • 不同的输入尽量得到不同的输出

Java的Object.hashCode()方法就是一个摘要算法。

目的

验证原始数据是否被篡改。

碰撞

对于输入集合元素的数量大于输出集合元素的数量时,必然有不同的输入,得到相同的输出情况发生,这就叫做碰撞。

安全摘要算法具有的特点

  • 碰撞率低
  • 不能猜测输出
  • 对于任意一个bit的变化的输入会得到完全不同的输出
  • 很难从输出反推输入(只能暴力穷举)

常用的摘要算法

Left-Aligned Center Aligned Right Aligned
col 3 is 128 bits 16 bits
SHA-1 160 bits 20 bits
SHA-256 256 bits 32 bits
RipeMD-160 160 bits 20 bits

用途

  • 校验文件的完整性

  • 存储用户口令

彩虹表攻击

黑客通过常用口令和MD5值形成一个二维表(彩虹表),再通过数据库口令的MD5值,在二维表中找到原始口令,从而获取用户口令。

Tips: 如何抵御彩虹表攻击?

可以采用对每个口令额外添加随机数salt,将md5(password)变成md5(password+salt),再将password和salt存入数据库中,这样便很难通过彩虹表方式进行攻击。

BouncyCastle

BouncyCastle是提供的加密/哈希算法的第三方,主要提供了JDK没有提供的算法,如RipeMD160。

Tips: 使用第三方算法前需要通过Security.addProvider()注册

Hmac

Hmac(Hash-based Message Authentication Code)是基于密钥的消息认证码算法,是更安全的消息摘要算法。HmacMD5可以看作带安全Salt的MD5

特点

  • Hmac是把Key混入摘要的算法(将salt替换成secret_key,secret_key具有64 bytes,更安全)
  • 可以配合MD5、SHA-1等摘要算法
  • 摘要长度和原摘要算法长度相同

对称加密算法

对称加密算法指加密和解密使用同一个密钥,例如WinRAR。

  • 加密:encrypt(key, message) -> encrypted
  • 解密:decrypt(key, encrypted) -> message

常用的对称加密算法

  • DES(密钥过短,可在短时间内暴力破解,废弃)
  • AES(密钥长度是128/192/256,使用256位加密需要修改JDK的policy文件)
  • IDEA

使用对称加密算法需要指定:算法名称/工作模式/填充模式

PBE

PBE(Password Based Encryption),可以理解为对称加密算法+摘要算法。

应用

如果把随机salt存储在U盘上,就得到一个“口令”+USB key的加密软件,这样做的好处是,即使用户的口令非常弱,在没有USB Key的情况下依然无法破解。

密钥交换算法

用来解决在不安全的信道上安全地传输密钥问题。比如,DH(Diffie-Hellman)算法。

Tips: DH算法不能解决中间人攻击问题。

非对称加密算法

非对称加密就是加密和解密使用的是不同的密钥,只有同一个公钥、私钥对才能正常加密、解密。

  1. 第一种方式

    • 加密:用自己的私钥加密,然后发送给对方

      encrypt(privateKeyA, message) -> encrypted

    • 解密:对方用自己的公钥解密

      decrypt(publicKeyA, encrypted) -> message

  2. 第二种方式

    • 加密:用对方的公钥加密,然后发送给对方

      encrypt(publicKeyB, message) -> encrypted

    • 解密:对方用自己的私钥解密

      decrypt(privateKeyB, encrypted) -> message

典型的算法有:

  • RSA(Ron Rivest, Adi Shamir, Leonard Adleman,三个人名的缩写)算法

特点

  • 优点:
    1. 对称加密需要协商密钥,而非对称加密可以安全地公开各自的密钥
  • 缺点:
    1. 运算速度慢
    2. 只使用非对称加密不能防止中间人攻击问题

数字签名算法

数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用摘要算法对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过。

目的

  • 确认消息是某个发送方发送的
  • 发送方不能抵赖他发送的消息
  • 数据在传输过程中没有被修改

常用的数字签名算法

  1. RSA签名算法
    • MD5withRSA
    • SHA1withRSA
    • SHA256withRSA
  2. DSA(Digital Signature Algorithm)签名算法,使用EIGamal数字签名算法,DSA只能配合SHA使用
    • SHA1withDSA
    • SHA256withDSA
    • SHA512withDSA
  3. 其它数字签名算法
    • ECDSA(Elliptic Curve Digital Signature Algorithm,由Bouncy Castle提供)

Tips: DSA数字签名算法比RSA数字签名算法更快,使用方式没有区别

数字证书

数字证书是集合了多种密码学算法,用于实现数据加解密、身份认证、签名等多种功能的网络安全标准。

数字证书采用链式签名管理,顶级CA证书已内置在操作系统中。

应用

  • HTTPS(HTTP over SSL)
    • 服务器发送证书给客户端(发送公钥、签名、CA)
    • 客户端验证证书
    • 客户端用证书公钥加密消息后发送给服务器
    • 服务器用自己的私钥解密
    • 随后使用AES对称加密进行通信

推荐阅读更多精彩内容

  • 1. ASCII 编码 ASCII(American Standard Code for Information ...
  • 这里先简单介绍单向散列函数、消息摘要和哈希碰撞的的概念 单向散列函数: 将任意长度的信息转换为较短的固定长度的值,...
  • 一、密码学的起源密码学的出现主要是因为战争,有了战争,就有了密码学的应用环境。在战争中,对阵双方要保护自己的通信安...
  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
  • 1.名词解释 数字签名:在ISO7498-2标准中定义为:"附加在数据单元上的一些数据,或是对数据单元所作的密码变...