/**
* 随机字符串集
*/
private static final String CHARACTORS = "efghxxxx";
/**
* 随机长度范围 6表示0~6
*/
private static final int RANDOM_LENGTH = 6;
/**
* 深度加密
*
* <br>
*
*
* @param plain 明文,待加密串
* @param salt 盐
* @return String 加密字符串
* @version V1.0
* @throws Exception
*/
public static String encrypt(String plain, String salt) {
if (StringUtils.isEmpty(salt)) {
log.error("salt是空值");
throw new IllegalArgumentException("salt是空值");
}
// 明文通过HMacSHA1 由动态key hash得到simple串
String simple = HMacSHA1.getSignature(plain, plain);
// hash + 加盐
simple = simple.concat(salt);
// 加盐simple串 通过HMacSHA1 由 固定KEY 再 hash得到complex串
String complex = HMacSHA1.getSignature(simple, KEY);
// complex串 由 HMacSHA1 经过动态key 再 hash得到 复杂的multiplex 串
String multiplex = HMacSHA1.getSignature(complex, complex);
// 对盐salt进行DES3加密
String des_salt = StaticKeyHelper.encryptKey(salt);
// multiplex 尾部拼接加密的盐 得到最终的结果串
String result = multiplex.concat(des_salt); // 机密salt链接在加密密码之后
return result;
}
深度随机盐
public static String salt() {
Random random = new Random();
// 随机字符串长度
int length = random.nextInt(RANDOM_LENGTH) + 5;
// 由给定chars串 生成随机长度为length的字符串
String salt = RandomStringUtils.random(length, CHARACTORS);
return salt;
}
对称解密得到盐
public static Map<String, String> resolvePassword(String encrypt) {
Map<String, String> params = new HashMap<String, String>();
// 从字符串字段中解析出加密密码和盐,并对盐进行解密
String persistent = encrypt.substring(0, 40);
String salt = encrypt.substring(40);
salt = StaticKeyHelper.descryptKey(salt);
params.put("password", persistent);
params.put("salt", salt);
return params;
}
对称加解密方法,key跟上面的key不一样
private static final String KEY = "abcdxxxx";
public static String encryptKey(String key) {
String s = "";
try {
s = DES3.encrypt(key, KEY);
} catch (Exception e) {
throw new RuntimeException("加密错误", e);
}
return s;
}
public static String descryptKey(String data) {
String s = "";
try {
s = DES3.decrypt(data, KEY);
} catch (Exception e) {
throw new RuntimeException("解密错误", e);
}
return s;
}
有了上述的加密方法,可以安全的对用户数据如密码进行加密了,并且数据库中存到加密数据不可逆,我们也不知道用户到底存的是什么密码,这才是安全的数据。
虽然我们不知道,但我们可以对用户的输入进行匹配校验,这个过程是一个对称的加密过程,即 一部分不可逆+一部分可逆= 加密串
//对用户的输入密码进行校验
String dbpwd = "数据库中的加密密码";
String salt = resolvePassword(dbpwd ).get("salt");
String encryptedPassword = PasswordHelper.encrypt(reqpwd, salt);
if (!dbpwd.equals(encryptedPassword)) {
throw new ServiceException(UserErrorCode.USER_NOT_FOUND, "用户帐号或密码错误");
}
分享到:
相关推荐
高安全性加密系统在智能电表中的应用.doc
电信设备-基于真随机复杂算法的高安全性加密通信系统.zip
电信设备-向物理层收发器传输安全性加密信息的方法和装置.zip
图像加密的安全性测试工具,可以测很多安全项,也可以测试密钥流
RSA算法是第一个能同时... RSA的安全性依赖于大整数的因式分解问题, 只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算技术和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。
已提出的不可信更新的前向安全公钥加密方案没有安全性证明,因此对方案的安全性存在质疑。对前向安全公钥加密方案进行扩展,给出具有可证明安全的不可信更新前向安全公钥加密方案,提出了不可信更新的前向安全公钥...
数据库系统概论 数据库安全性 数据加密,概述。集中加密算法的简单介绍。
实例RSA加密;RSA是非对称算法的加密代表。
安全性之加密PPT模板.pptx,安全性之加密PPT,适用于分析与安全有关的服务或者数据处理和数据传输安全性等各种情况,可以用在网络大会PPT中,业务培训PPT中,安防行业PPT中,该PPT展示突出了数据加密、邮件
1.JAVA生成PDF文件,可加密及设置安全性 2.含编译好的其他jar包 3.含示例。
为了验证文献中提出的一种基于Logistic强混沌映射和陈氏超混沌系统的图像加密算法的安全性,对其进行了安全性分析,提出了适用于任意大小加密图像的已知明文攻击方法和选择明文攻击方法。同时,指出了原加密算法不...
Android 的安全性问题一直备受关注,Google 在 Android 系统的安全方面也是一直没有停止过更新,努力做到更加安全的手机移动操作系统。 在 Android 的安全性方面,有很多模块: 1 内核安全性 2 应用安全性 3 应用...
基于Oracle模型的可认证加密协议安全性分析.pdf
对一种神经网络加密方案的安全性分析.pdf
针对Gao等人提出的一种基于超混沌系统的图像加密算法的安全性缺陷,提出了一种改进的图像加密算法,该算法利用超混沌产生的超混沌序列对明文不同的像素点采用不同的方式进行加密。仿真实验结果表明,改进算法加密...
加密安全聊天论文,使用了加密算法..............................................................................................................................................
广播加密和基于属性加密是两种重要的公钥加密方案,可将加密内容同时传送给多个用户,在付费电视、数字版权管理和资源访问控制等领域有重要应用。对一个基于身份广播加密方案进行了分析,表明攻击者只要得到某个用户...
RSA加密算法介绍、原理、加解密以及安全性分析。
基于混沌的图像加密与数字水印算法的安全性研究
认证签名加密.ppt,数据在网络中传输的安全性