Java编码与加密

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对称加密进行通信
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

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