廖雪峰Java10加密与安全-4加密算法-2口令加密算法
对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令。如果由用户输入口令,进行加密/解密,需要用到PBE算法。
1.PBE:Password Based Encryption
- 由用户输入口令,采用随机数杂凑计算出密钥再进行加密
- Password:用户口令,例如“hello123”
- Salt:随机生成的byte[]
- Key:由随机的salt和password计算而成:generate(byte[] salt,String password)
2.AES和PBE的对比:
AES
byte[] message = ...;
byte[] key = generated16Bytes();//算法随机生成16字节的数组
byte[] encrypted = aes128_encrypt(key, message);
PBE
byte[] message = ...;
String password = "hello123";
byte[] salt = random16Bytes();//随机产生一个16字节的salt
//为什么引入salt?因为用户输入的口令通常都很短,引入一个随机的salt,既可增加口令的长度,还可以让相同的口令生成不同的key,从而提高安全性。
byte[] key = generated16BytesFrom(password, salt);
byte[] encrypted = aes128_encrypt(key,message);
3.代码示例:salt不固定
package com.testList;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;
public class SplitString {
static final String CIPHER_NAME = "PBEwithSHA1and128bitAES-CBC-BC";
//加密
public static byte[] encrypt(String password, byte[] salt, byte[] input) throws GeneralSecurityException {
//传入char数组,获取一个PBEKeySpec的对象keySpec
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
//获取SecretKeyFactory对象skeyFactory
SecretKeyFactory skeyFactory = SecretKeyFactory.getInstance(CIPHER_NAME);
//传入keySpec,获取密钥:SecretKey类型的示例skey
SecretKey skey = skeyFactory.generateSecret(keySpec);
//将salt和用户输入的口令做1000次循环,获取PBEParameterSpec类型示例pbesp
PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);
Cipher cipher = Cipher.getInstance(CIPHER_NAME);
//初始化:指定加密模式,传入skey,pbeps对象
cipher.init(Cipher.ENCRYPT_MODE, skey, pbeps);
return cipher.doFinal(input);
}
public static byte[] decrypt(String password, byte[] salt, byte[] input) throws GeneralSecurityException {
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory skeyFactory = SecretKeyFactory.getInstance(CIPHER_NAME);
SecretKey skey = skeyFactory.generateSecret(keySpec);
PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);
Cipher cipher = Cipher.getInstance(CIPHER_NAME);
//初始化:指定解密模式,传入skey,pbeps对象
cipher.init(Cipher.DECRYPT_MODE, skey, pbeps);
return cipher.doFinal(input);
}
public static void main(String[] args) throws Exception{
//把BouncyCastle作为provider添加到java.security
Security.addProvider(new BouncyCastleProvider());
String message = "Hello world!encrypted using PBE!";
String password = "hello12345";
//16字节的salt
byte[] salt = SecureRandom.getInstanceStrong().generateSeed(16);
System.out.printf("salt:%032x\n",new BigInteger(1,salt));
byte[] data = message.getBytes(StandardCharsets.UTF_8);
byte[] encryted = encrypt(password,salt,data);
//打印Base64加密后的密文
System.out.println("encrypted:"+Base64.getEncoder().encodeToString(encryted));
byte[] decrypted = decrypt(password,salt,encryted);
System.out.println("decrypted:"+new String(decrypted,"UTF-8"));
}
}

由于每次的salt不一样,每次的密文也不一样。
4.salt固定
如果把salt固定,就得到了一个通用的口令加密软件。
只有同事破解了salt+口令,才能解密。而salt为128为随机数,很难被破解

5.总结:
- PBE算法通过用户口令和随机salt计算key然后再加密
- key通过口令和随机salt计算出,提高了安全性
- PBE算法内部使用的仍然是标准对称加密算法(例如AES)
廖雪峰Java10加密与安全-4加密算法-2口令加密算法的更多相关文章
- 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法
1.非对称加密 非对称加密就是加密和解密使用的不是相同的密钥 方法1: * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s * 解密:对 ...
- 廖雪峰Java10加密与安全-4加密算法-4密钥交换算法
1DH算法 1.1.原根公式:g^i mod P 条件:1<g<P,0<i<P 原根:介于[1, p-1]之间的任意2个数i,j(p为素数,i≠j)的结果不相等,即 g^i m ...
- 廖雪峰Java10加密与安全-4加密算法-1对称加密算法
1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...
- 廖雪峰Java10加密与安全-2加密算法-2Base64编码
1.Base64编码 Base64一种把二进制数据用文本表示的编码算法.例如 中有3个字节{\xe4, \xb8, \xad},一共是24位,每6位分组,变成4个字节{39, 0b, 22, 2d}, ...
- 廖雪峰Java10加密与安全-2加密算法-1URL编码
1.URL编码 URL编码是浏览器发送数据给服务器时使用的编码. 如通过百度搜索美女: 编码前:https://www.baidu.com/s?wd=美女 编码后:https://www.baidu. ...
- 廖雪峰Java10加密与安全-6数字证书-1数字证书
数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改
- 廖雪峰Java10加密与安全-1数据安全-1加密与安全概念
数据安全 防窃听 防篡改 防伪造 古代加密方式: 移位密码:HELLO =>IFMMP 替代密码:HELLO=>p12,5,3 现代加密方式: 建立在严格的数学理论基础上 密码学逐渐发展成 ...
- 廖雪峰Java10加密与安全-5签名算法-1RSA签名算法
1.数字签名 甲在发送加密消息的时候,还要发送自己的签名,而这个签名是用甲的privateKey计算的:而乙要验证这个签名是否是合法的,会用甲的publicKey去验证,如果验证成功,这个消息确实是甲 ...
- 廖雪峰Java10加密与安全-3摘要算法-5Hmac
1 比较MD5和HamcMD5 HmacMD5可以看作带安全salt的MD5 import javax.crypto.KeyGenerator; import javax.crypto.Mac; im ...
随机推荐
- LUOGU P4394 [BOI2008]Elect 选举 (背包)
传送门 解题思路 一眼看上去就像个背包,然后就是\(0/1\)背包改一改,结果发现过不了样例.后来想了一下发现要按\(a\)从大到小排序,因为如果对于一个>=总和的一半但不满足的情况来说,把最小 ...
- windows下,根据端口号杀死进程
1.cmd下,根据端口号查询进程号 C:\>netstat -ano|findstr " 2.根据进程号928,在任务管理器杀死PID为928进程 注意:默认情况下,进程选项卡里没有P ...
- iOS之NSArray类簇简介-(copy、mutableCopy导致程序crash)
1.前言 开发时常常用数组对数据进行处理,对NSMutableArray进行操作时经常导致程序崩溃,特研究一下NSArray的类簇!涉及__NSPlaceholderArray.__NSArray0. ...
- CSS 实现自适应正方形
在处理移动端页面时,我们有时会需要将banner图做成与屏幕等宽的正方形以获得最佳的体验效果,比如,商品详情页, 方法1.CSS3 vw单位 CSS3 中新增了一组相对于可视区域百分比的长度单位 vw ...
- <Django>第一篇:入门的例子
1.MVT框架 Model(模型):数据库交互相关.在这部分一般需要进行三个操作: (1)面向数据库:模型对象.列表 (2)定义模型类:指定属性及类型,确定表结构(设计表),需要迁移(生成表) (3) ...
- java空和非空判断
public static boolean isEmpty(String str){ if("".equals(str)||str==null){ return true; }el ...
- 2018-8-10-win10-uwp-打开文件管理器选择文件
title author date CreateTime categories win10 uwp 打开文件管理器选择文件 lindexi 2018-08-10 19:16:50 +0800 2018 ...
- AM历史消息及文件记录删除
1.下载 folderclear.bat 文件 2.用编辑方式打开这个文件 3.对里面的参数做修改 4.这个批处理文件,保留了 完整的一个月的消息记录 (如 今天是 2017.3.15 ,那么 清除数 ...
- 【JZOJ3423】Vani和Cl2捉迷藏&【BZOJ1143】祭祀river
description vani和cl2在一片树林里捉迷藏-- 这片树林里有N座房子,M条有向道路,组成了一张有向无环图. 树林里的树非常茂密,足以遮挡视线,但是沿着道路望去,却是视野开阔.如果从房子 ...
- natapp出现Invalid Host header
前端是vue 3.x 项目,需要更改vue的配置文件 vue.config.js,在module.exports中添加devServer:{disableHostCheck:true}