Java编码算法和摘要算法
编码算法
- 编码算法是将一种形式转换成等价的另外一种形式。主要是为了方便某种特定场景的处理。
 - 字母如何在计算机中表示呢?
- 用ASCII编码
 
 - 那中文字符如何在计算机中表示呢?
- 用Unicode编码
 
 - 如何同时兼容字母和中文呢?
- 用UTF-8编码
 
 
  
- 我浏览器想给服务器发送数据,有没有什么编码方式呢?
- 用URL编码
 - 一般规则
- A-Z, a-z, 0-9, -_.* 保持不变
 - 其他字符以%XX表示(如,中:%E4%B8%AD (UTF8:E4B8AD))
 
 
 
- 发邮件的时候二进制附件怎么发送呢?
- 用Base64编码
 - 把二进制数据用文本表示的编码算法,二进制6位6位的通过映射表进行映射。
 - 比如 : 中编码之后是 "5Lit",过程如下
 
 
      
- 点评
- 适用于文本协议,但长度会增加1/3,如果数组长度不是3的整数倍,末尾会增加一个或两个0x00(对应的是一个或两个==)
 
 
- 点评
 
摘要算法(哈希算法)
- 目的是验证原始数据有没有被篡改
 - 一些基本原则
- 输入长度不定,输出长度固定
 - 相同的输入就有相同的输出
 - 不同的输入尽量得到不同的输出
 
 - 会有什么问题:有可能会发生碰撞。
 - 一个好的摘要算法需要具备的安全性
- 碰撞率低
 - 不能猜测输出
 - 输入的任意一个bit的变化都会造成输出的完全的不同
 - 很难从输出反推输入
 
 - 常用的摘要算法有哪些
 

- MD5
- 可以用于文件验证,存储口令,登录验证。
 - 用于存储口令的时候需要注意什么问题?
 
 
- MD5
 
- 需要预防彩虹表攻击:采用一些简单的字符md5加密。
 - 办法是:md5.update(salt+inputPassward) (salt是一些额外的随机数)
 
- SHA-1/SHA-256/SHA-512(Secure Hash Algorithm)
- 可以看成MD5的加强版,输出由128位变为160/256/512位。
 - 但是相应的:加解密速度比MD5要慢。
 
 
- SHA-1/SHA-256/SHA-512(Secure Hash Algorithm)
 
- RipeMD 160
- 第三方提供,非JDK自带,使用时需要先引入对应cprov-jdk15on-160.jar包
 
 
- RipeMD 160
 
- Hmac(Hash-based Message Authentication Code)
- 更安全的消息摘要算法,基于秘钥
 - 加密思想类似 md5(salt+input),咱Hmac中salt是64位
 - 可以用HmacMD5/HmacSHA1/HmacSHA256/HmacSHA512几种
 
 
- Hmac(Hash-based Message Authentication Code)
 
编码算法和摘要算法的代码如下
package TestDemo; import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.util.Base64; import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class Test {
public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException { //URL编码
String urlBeforeEncode = "http://www.cnblogs.com/darrenqiao/";
//支持的编码格式 :US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16
String urlAfterEncode = URLEncoder.encode(urlBeforeEncode, "UTF-8");
System.out.println("url进行URL编码的链接为: " + urlBeforeEncode);
System.out.println("url进行URL编码的链接为: " + urlAfterEncode); byte[] input = new String("darrenqiao").getBytes();
//Base64编码
String urlAfterBase64Encode = Base64.getUrlEncoder().encodeToString(urlBeforeEncode.getBytes());
System.out.println("url进行Base64编码之后的文本: " + urlAfterBase64Encode);
System.out.println("Base64编码前的六进制码流: " + String.format("%032x", new BigInteger(input)));
String base64Output = Base64.getEncoder().encodeToString(input);
System.out.println("Base64编码后的文本: " + base64Output); //MD5加密
MessageDigest md5 = MessageDigest.getInstance("MD5");
System.out.println("加密前的十六进制码流: " + String.format("%032x", new BigInteger(input)));
md5.update(input);
byte[] md5Output = md5.digest();
System.out.println("md5加密后的十六进制码流: " + String.format("%032x", new BigInteger(md5Output))); //SHA-1加密
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
sha1.update(input);
byte[] sha1Output = sha1.digest();
System.out.println("SHA-1加密后的十六进制码流: " + String.format("%032x", new BigInteger(sha1Output))); //SHA-256加密
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
sha256.update(input);
byte[] sha256Output = sha256.digest();
System.out.println("SHA-256加密后的十六进制码流: " + String.format("%032x", new BigInteger(sha256Output))); //SHA-512加密
MessageDigest sha512 = MessageDigest.getInstance("SHA-512");
sha512.update(input);
byte[] sha512Output = sha512.digest();
System.out.println("SHA-512加密后的十六进制码流: " + String.format("%032x", new BigInteger(sha512Output))); //RipeMD-160加密
Security.addProvider(new BouncyCastleProvider());
MessageDigest ripeMD160 = MessageDigest.getInstance("RipeMD160");
ripeMD160.update(input);
byte[] ripeMD160Output = ripeMD160.digest();
System.out.println("RipeMD-160加密后的十六进制码流: " + String.format("%032x", new BigInteger(ripeMD160Output))); //HmacMD5加密,HmacSHA1/HmacSHA256/HmacSHA512这几种只要替换参数就可以
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
SecretKey secretKey = keyGenerator.generateKey();
Mac mac = Mac.getInstance("HmacMD5");
mac.init(secretKey);
mac.update(input);
byte[] hmacMD5Output = mac.doFinal();
System.out.println("HmacMD5加密后的十六进制码流: " + String.format("%032x", new BigInteger(hmacMD5Output))); } }
运行结果如下

Java编码算法和摘要算法的更多相关文章
- Java 密码学算法
		
Java 密码学算法 候捷老师在< 深入浅出MFC 2e(电子版)>中引用林语堂先生的一句话: 只用一样东西,不明白它的道理,实在不高明 只知道How,不知道Why,出了一点小问题时就无能 ...
 - 【字符编码】字符编码 && Base64编码算法
		
一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...
 - 【JAVA编码专题】深入分析 Java 中的中文编码问题
		
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ 几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么 ...
 - Java排序算法(一)
		
Java排序算法(一) 排序的基本概念和分类 1.1排序的定义 在<大话数据结构>中,排序定义为,假设含有n个记录的序列为{r1,r2,...,rn},其相应的关键字{k1,k2,..., ...
 - Java编码安全
		
目录 Java编码安全 数据校验 规则1.1:校验跨信任边界传递的不可信数据 规则1.2:禁止直接使用不可信数据来拼接SQL语句 规则1.4:禁止直接使用不可信数据来记录数据 规则1.6:验证路径前将 ...
 - Android数据加密之Base64编码算法
		
前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
 - java编码过滤器
		
1.java编码过滤器的作用: java过滤器能够对目标资源的请求和响应进行截取,过滤信息执行的优先级高于servlet. 2.java过滤器的使用: (1)编写一个普通的java类,实现Filter ...
 - java中文乱码解决之道(四)-----java编码转换过程
		
前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的.但是了解这些仅仅只是一个开始,以下博客将侧重介绍java乱码是如何 ...
 - 史上最全的java随机数生成算法分享(转)
		
这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法 String password = RandomUtil.generat ...
 
随机推荐
- Effective C++(6)  如何拒绝编译器的自动生成函数
			
问题聚焦: 如果不希望class支持某一成员函数,那么不声明和定义它就可以了,但是这一策略对与拷贝构造函数和重载赋值操作符并不起作用. 因为如果不声明它们,那么当尝试调用它们的时候,编译器会为你声明和 ...
 - Java学习---传输安全设计
			
1.计算机安全的概念 用于保护数据和阻止Hacker的工具统称为计算机安全(Computer Security).信息安全最基本的方法就是利用加密信息防止未授权的人窃听,加密是以某种特殊的算法改变原有 ...
 - Exchange 2016 CU6 安装后,发生错误 出现意外错误,无法处理您的请求
			
公司的Exchange2016环境准备上线了,今天owa打不开了.出现如下图的错误,更多详细信息没有截图,但最关键的一句记下来了. X-OWA-Error Microsoft.Exchange.Dia ...
 - 沉淀再出发:再谈java的多线程机制
			
沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于ja ...
 - Linux中脚本的使用方法
			
Linux中脚本的使用方法 一.前言 关于Linux中的脚本的用法,一直没有时间去好好地总结,正好今天下雨,就好好的整理一下思路吧,其实精通了一门语言,比如C语言,学习其他语言需要的成本是非常少的,同 ...
 - selenium+python smtp邮件
			
#code:utf-8 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIM ...
 - Directed Graphs
			
有向图 Introduction 就是边是有方向的,像单行道那样,也有很多典型的应用. 点的出度指从这个点发出的边的数目,入度是指向点的边数.当存在一条从点 v 到点 w 的路径时,称点 v 能够到达 ...
 - Shell传递参数【转载】
			
Shell 传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 实例 以 ...
 - JavaScript事件的委派与事件的绑定
			
事件的委派 在很多需求中,通常元素是动态创建添加到一个父元素中的,这时候我们点击新增的元素是没有反应的 <script type="text/javascript"> ...
 - 【jQuery】学习jQuery插件的使用与写法(表单验证插件-validation)
			
最新最全的插件可以从jQuery官方网站的插件板块下载,网站地址为:http://plugins.jquery.com/ Validation优点:内置验证规则:自定义验证规则:简单强大的验证信息提示 ...