博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么接口需要加密传输
阅读量:2161 次
发布时间:2019-05-01

本文共 4924 字,大约阅读时间需要 16 分钟。

单向散列加密

散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。

单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:
1、MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。
2、SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;
SHA-1与MD5的比较
因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
1、对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
2、对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
3、速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

1、特征:雪崩效应、定长输出和不可逆。

2、作用是:确保数据的完整性。
3、加密算法:md5(标准密钥长度128位)、sha1(标准密钥长度160位)、md4、CRC-32
4、加密工具:md5sum、sha1sum、openssl dgst。
5、计算某个文件的hash值,例如:md5sum/shalsum FileName,openssl dgst –md5/-sha

MD5加密

在线MD5解密与加密

Java操作MD5加密

MD5加盐实现方式

一般使用的加盐:

md5(Password+UserName),即将用户名和密码字符串相加再MD5,这样的MD5摘要基本上不可反查。

但有时候用户名可能会发生变化,发生变化后密码即不可用了(验证密码实际上就是再次计算摘要的过程)。

----------

因此我们做了一个非常简单的加盐算法,每次保存密码到数据库时,都生成一个随机16位数字,将这16位数字和密码相加再求MD5摘要,然后在摘要中再将这16位数字按规则掺入形成一个48位的字符串。

在验证密码时再从48位字符串中按规则提取16位数字,和用户输入的密码相加再MD5。按照这种方法形成的结果肯定是不可直接反查的,且同一个密码每次保存时形成的摘要也都是不同的。

代码如下:

 

/** * MD5加盐加密 */public class PasswordUtil {	/**	 * 生成含有随机盐的密码	 */	public static String generate(String password) {		Random r = new Random();		StringBuilder sb = new StringBuilder(16);		sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));		int len = sb.length();		if (len < 16) {			for (int i = 0; i < 16 - len; i++) {				sb.append("0");			}		}		String salt = sb.toString();		password = md5Hex(password + salt);		char[] cs = new char[48];		for (int i = 0; i < 48; i += 3) {			cs[i] = password.charAt(i / 3 * 2);			char c = salt.charAt(i / 3);			cs[i + 1] = c;			cs[i + 2] = password.charAt(i / 3 * 2 + 1);		}		return new String(cs);	}	/**	 * 校验密码是否正确	 */	public static boolean verify(String password, String md5) {		char[] cs1 = new char[32];		char[] cs2 = new char[16];		for (int i = 0; i < 48; i += 3) {			cs1[i / 3 * 2] = md5.charAt(i);			cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);			cs2[i / 3] = md5.charAt(i + 1);		}		String salt = new String(cs2);		return md5Hex(password + salt).equals(new String(cs1));	}	/**	 * 获取十六进制字符串形式的MD5摘要	 */	public static String md5Hex(String src) {		try {			MessageDigest md5 = MessageDigest.getInstance("MD5");			byte[] bs = md5.digest(src.getBytes());			return new String(new Hex().encode(bs));		} catch (Exception e) {			return null;		}	}	public static void main(String[] args) {		// 加密+加盐		String password1 = generate("admin");		System.out.println("结果:" + password1 + "   长度:" + password1.length());		// 解码		System.out.println(verify("admin", password1));		// 加密+加盐		String password2 = generate("admin");		System.out.println("结果:" + password2 + "   长度:" + password2.length());		// 解码		System.out.println(verify("admin", password2));
4.0.0
com.learn
encription_b
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.1.1
mysql
mysql-connector-java
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.apache.tomcat.embed
tomcat-embed-jasper
org.springframework.boot
spring-boot-starter-log4j
1.3.8.RELEASE
org.springframework.boot
spring-boot-starter-aop
commons-lang
commons-lang
2.6
org.apache.httpcomponents
httpclient
com.alibaba
fastjson
1.2.47
org.springframework.boot
spring-boot-starter-data-redis
javax.servlet
jstl
taglibs
standard
1.1.2
org.bouncycastle
bcprov-jdk15
1.46
net.iharder
base64
2.3.8

 

转载地址:http://lbkzb.baihongyu.com/

你可能感兴趣的文章
Logistic Regression 为什么用极大似然函数
查看>>
SVM 的核函数选择和调参
查看>>
LightGBM 如何调参
查看>>
用 TensorFlow.js 在浏览器中训练神经网络
查看>>
cs230 深度学习 Lecture 2 编程作业: Logistic Regression with a Neural Network mindset
查看>>
梯度消失问题与如何选择激活函数
查看>>
为什么需要 Mini-batch 梯度下降,及 TensorFlow 应用举例
查看>>
为什么在优化算法中使用指数加权平均
查看>>
什么是 Q-learning
查看>>
用一个小游戏入门深度强化学习
查看>>
如何应用 BERT :Bidirectional Encoder Representations from Transformers
查看>>
5 分钟入门 Google 最强NLP模型:BERT
查看>>
强化学习第1课:像学自行车一样的强化学习
查看>>
强化学习第2课:强化学习,监督式学习,非监督式学习的区别
查看>>
强化学习第3课:有些问题就像个赌局
查看>>
强化学习第4课:这些都可以抽象为一个决策过程
查看>>
强化学习第5课:什么是马尔科夫决策过程
查看>>
强化学习第6课:什么是 Crossentropy 方法
查看>>
强化学习第7课:交叉熵方法的一些局限性
查看>>
强化学习 8: approximate reinforcement learning
查看>>