目录

  • 1 常见的加密方式
    • 1.1.可逆加密算法
      • 1.1.1. 对称加密
      • 1.1.2. 非对称加密
    • 1.2.不可逆加密算法
    • 1.3.Base64编码
  • 2 密码加密的方式选型
    • 2.1 MD5密码加密
    • 2.2 手动加密(md5+随机字符串)
    • 2.3 . BCrypt密码加密
  • 3 jwt介绍
    • 3.1 token认证-面试
    • 3.2 什么是JWT?
    • 3.3 生成token

1 常见的加密方式

由于在学习JWT的时候会涉及使用很多加密算法, 所以在这里做下扫盲, 简单了解就可以

加密算法种类有:

1.1.可逆加密算法

解释: 加密后, 密文可以反向解密得到密码原文.

1.1.1. 对称加密

用的较少因为不安全,要把秘钥也给别人

文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥

解释: 在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊的加密算法处理后,使其变成复杂的加密密文发送出去,收信方收到密文后,若想解读出原文,则需要使用加密时用的密钥以及相同加密算法的逆算法对密文进行解密,才能使其回复成可读明文。在对称加密算法中,使用的密钥只有一个,收发双方都使用这个密钥,这就需要解密方事先知道加密密钥。

优点: 对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。

缺点: 没有非对称加密安全.

用途: 一般用于保存用户手机号、身份证等敏感但能解密的信息。

常见的对称加密算法有: AES、DES、3DES、Blowfish、IDEA、RC4、RC5、RC6、HS256

1.1.2. 非对称加密

两个密钥:公开密钥(publickey)和私有密钥,公有密钥加密,私有密钥解密

**解释: ** 同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端.

加密与解密:

  • 私钥加密,持有公钥才可以解密
  • 公钥加密,持有私钥才可解密

签名:

  • 私钥签名, 持有公钥进行验证是否被篡改过.

**优点: ** 非对称加密与对称加密相比,其安全性更好;

缺点: 非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
用途: 一般用于签名和认证。私钥服务器保存, 用来加密, 公钥客户拿着用于对于令牌或者签名的解密或者校验使用.

常见的非对称加密算法有: RSA、DSA(数字签名用)、ECC(移动设备用)、RS256 (采用SHA-256 的 RSA 签名)

1.2.不可逆加密算法

解释: 一旦加密就不能反向解密得到密码原文.

种类: Hash加密算法, 散列算法, 摘要算法等

**用途:**一般用于效验下载文件正确性,一般在网站上下载文件都能见到;存储用户敏感信息,如密码、 卡号等不可解密的信息。

常见的不可逆加密算法有: MD5、SHA、HMAC

1.3.Base64编码

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息。采用Base64Base64编码解码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。注意:Base64只是一种编码方式,不算加密方法。

在线编码工具:

http://www.jsons.cn/img2base64/

2 密码加密的方式选型

common工程test下测试

2.1 MD5密码加密

java //md5加密 DegestUtils:spring框架提供的工具类 String md5Str = DigestUtils.md5DigestAsHex("abc".getBytes()); System.out.println(md5Str);//900150983cd24fb0d6963f7d28e17f72 ​

md5相同的密码每次加密都一样,不太安全

2.2 手动加密(md5+随机字符串)

在md5的基础上手动加盐(salt)处理


//uername:zhangsan  password:123   salt:随时字符串
String salt = RandomStringUtils.randomAlphanumeric(10);//获取一个10位的随机字符串
System.out.println(salt);
String pswd = "123"+salt;String saltPswd = DigestUtils.md5DigestAsHex(pswd.getBytes());
System.out.println(saltPswd);

这样同样的密码,加密多次值是不相同的,因为加入了随机字符串

2.3 . BCrypt密码加密

在用户模块,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。 目前,MD5和BCrypt比较流行。相对来说,BCrypt比MD5更安全。

BCrypt 官网http://www.mindrot.org/projects/jBCrypt/

(1)我们从官网下载源码

(2)新建工程,将源码类BCrypt拷贝到工程

(3)新建测试类,main方法中编写代码,实现对密码的加密

java String gensalt = BCrypt.gensalt();//这个是盐 29个字符,随机生成 System.out.println(gensalt); String password = BCrypt.hashpw("123456", gensalt); //根据盐对密码进行加密 System.out.println(password);//加密后的字符串前29位就是盐 ​

(4)新建测试类,main方法中编写代码,实现对密码的校验。BCrypt不支持反运算,只支持密码校验。

java boolean checkpw = BCrypt.checkpw("123456", "$2a$10$61ogZY7EXsMDWeVGQpDq3OBF1.phaUu7.xrwLyWFTOu8woE08zMIW"); System.out.println(checkpw); ​

3 jwt介绍

3.1 token认证-面试

随着 Restful API、微服务的兴起,基于 Token 的认证现在已经越来越普遍。基于token的用户认证是一种服务端无状态的认证方式,所谓服务端无状态指的token本身包含登录用户所有的相关数据,而客户端在认证后的每次请求都会携带token,因此服务器端无需存放token数据。

当用户认证后,服务端生成一个token发给客户端,客户端可以放到 cookie 或 localStorage 等存储中,每次请求时带上 token,服务端收到token通过验证后即可确认用户身份。

3.2 什么是JWT?

我们现在了解了基于token认证的交互机制,但令牌里面究竟是什么内容?什么格式呢?市面上基于token的认证方式大都采用的是JWT(Json Web Token)。

JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。

JWT令牌结构:

JWT令牌由Header、Payload、Signature三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz

  • Header

头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC、SHA256或RSA)。

一个例子:

json { "alg": "HS256", "typ": "JWT" } ​

将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。

  • Payload

第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比
如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。
此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。
一个例子:

json { "sub": "1234567890", "name": "456", "admin": true } ​

最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。

  • Signature

第三部分是签名,此部分用于防止jwt内容被篡改。
这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明
签名算法进行签名。
一个例子:

shell HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret) ​

base64UrlEncode(header):jwt令牌的第一部分。
base64UrlEncode(payload):jwt令牌的第二部分。
secret:签名所使用的密钥。

下图中包含一个生成的jwt令牌:

3.3 生成token

查看utils工程

需要引入jwt相关依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId>
</dependency>

工具类

package com.oldlu.utils.common;import io.jsonwebtoken.*;import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;public class AppJwtUtil {// TOKEN的有效期一天(S)private static final int TOKEN_TIME_OUT = 3_600;// 加密KEYprivate static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";// 最小刷新间隔(S)private static final int REFRESH_TIME = 300;// 生产IDpublic static String getToken(Long id){Map<String, Object> claimMaps = new HashMap<>();claimMaps.put("id",id);long currentTime = System.currentTimeMillis();return Jwts.builder().setId(UUID.randomUUID().toString()).setIssuedAt(new Date(currentTime))  //签发时间.setSubject("system")  //说明.setIssuer("oldlu") //签发者信息.setAudience("app")  //接收用户.compressWith(CompressionCodecs.GZIP)  //数据压缩方式.signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式.setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000))  //过期时间戳.addClaims(claimMaps) //cla信息.compact();}/*** 获取token中的claims信息** @param token* @return*/private static Jws<Claims> getJws(String token) {return Jwts.parser().setSigningKey(generalKey()).parseClaimsJws(token);}/*** 获取payload body信息** @param token* @return*/public static Claims getClaimsBody(String token) {try {return getJws(token).getBody();}catch (ExpiredJwtException e){return null;}}/*** 获取hearder body信息** @param token* @return*/public static JwsHeader getHeaderBody(String token) {return getJws(token).getHeader();}/*** 是否过期** @param claims* @return -1:有效,0:有效,1:过期,2:过期*/public static int verifyToken(Claims claims) {if(claims==null){return 1;}try {claims.getExpiration().before(new Date());// 需要自动刷新TOKENif((claims.getExpiration().getTime()-System.currentTimeMillis())>REFRESH_TIME*1000){return -1;}else {return 0;}} catch (ExpiredJwtException ex) {return 1;}catch (Exception e){return 2;}}/*** 由字符串生成加密key** @return*/public static SecretKey generalKey() {byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;}public static void main(String[] args) {/* Map map = new HashMap();map.put("id","11");*/System.out.println(AppJwtUtil.getToken(1102L));Jws<Claims> jws = AppJwtUtil.getJws("eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQqEMAwA_5KzhURNt_qb1KZYQSi0wi6Lf9942NsMw3zh6AVW2DYmDGl2WabkZgreCaM6VXzhFBfJMcMARTqsxIG9Z888QLui3e3Tup5Pb81013KKmVzJTGo11nf9n8v4nMUaEY73DzTabjmDAAAA.4SuqQ42IGqCgBai6qd4RaVpVxTlZIWC826QA9kLvt9d-yVUw82gU47HDaSfOzgAcloZedYNNpUcd18Ne8vvjQA");Claims claims = jws.getBody();System.out.println(claims.get("id"));}
}

常见登录密码加密方式相关推荐

  1. Java 对用户密码加密(Jeecg 登录密码加密方式)MD5andDES方式

    jeecg对应的路径为org.jeecgframework.core.util下的PasswordUtil  可参考作为其他应用的加密方式或者第三方使用Jeecg账号验证登录: 直接上代码(可直接调用 ...

  2. java常见的密码加密方式base64,Sha256,MD5

    java对密码常见的加密方式: 一.MD5 String password="123456"; String salt = StaticConstant.SALT; new Sim ...

  3. 2012年5月后QQ空间最新登录密码加密方式破源码

    最新2012年5月后的登录QQ空间加密新算法源码,需要开发QQ外挂的可以参考参考! 下载地址:http://download.csdn.net/detail/web_boy/4369470

  4. [转]常见的用户密码加密方式以及破解方法

    [作者]张辉,就职于携程技术中心信息安全部,负责安全产品的设计与研发. 作为互联网公司的信息安全从业人员经常要处理撞库扫号事件,产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密 ...

  5. 关于登录密码加密的三个方式

    登录密码对于用户来说是最重要的数据,所以在存储的时候需要进行加密,防止在一些外部攻击下用户重要数据被别人获取了.对于登录密码加密,本人整理了三种简单的方式. 具体思路如下: 一.数据库加密 1.在后端 ...

  6. 易语言POST里常见的JS加密方式,JS解密教程

    首先录制了套易语言POST从入门到JS解密的精通教程.估计近100集,正在更新中,目前暂时可以在网站上看前几集 在线看地址 https://www.bilibili.com/video/av39727 ...

  7. 新浪微博登录密码加密函数 wsse加密算法说明

    // 新浪微博登录密码加密函数 // password   密码明文 // servertime 提交的参数之一 // nonce      提交的参数之一 // encode_password 输出 ...

  8. mysql8 修改加密方式_mysql8修改密码加密方式

    mysql8用navicat可视化连接会报错加密方式错误,想要连接mysql8有两种方式 1:安装MySQL8客户端 2:修改MySQL8的密码加密方式 我采用的是第二种,因为服务器上是MySQL8, ...

  9. 织梦CMS的管理员密码加密方式

    织梦CMS的管理员密码加密方式(可还原MD516) ---------------------------------- 得到了用户名和密码如下: INSERT INTO `dede_admin` V ...

最新文章

  1. XFCE字体发虚的解决方法
  2. 如何检测如果滚动条是否可见控件上
  3. brew安装mysql 卸载_Ubuntu环境下MySQL卸载安装配置远程访问三步曲
  4. 学习这门课的一些问题
  5. java的注释规范_Java代码注释规范
  6. 篝火 2004 年11-15
  7. boost::fusion::at_c用法的测试程序
  8. ES6新特性之函数优化-箭头函数
  9. jsp标记之动作标记介绍
  10. (转)Bootstrap 之 Metronic 模板的学习之路 - (5)主题布局配置
  11. Java学习笔记——常用类
  12. Java 面试如何坐等 offer?
  13. 面试官:谈谈分布式一致性机制,我一脸懵逼。。
  14. CISSP考试心得分享
  15. 0matlab计算锚泊系统,一种基于蒙特卡洛仿真的计算锚地容量的方法与流程
  16. 大数据审计的发展_关于发展大数据审计的几点思考
  17. 小程序文档整理之 -- API(调试接口)
  18. [AS3.0.1]蓝牙的基本使用,搜索和配对
  19. 基于ssm的仿微博系统的设计与实现
  20. 坦克世界怎么显示服务器准心,坦克世界8.0环境设置详细教程

热门文章

  1. OMAP开发板的启动过程
  2. 生成真正的随机数(非伪随机数)
  3. chatgpt如何自动生成角色prompt模板
  4. 统计学知识大梳理(三)
  5. 业务与系统的傲慢与偏见
  6. 二分类神经网络结果准确率50%,loss一直在0.69的解决方法
  7. 离散数学:关系的性质
  8. 记一次java实现excel导出
  9. 几本关于用户体验的书籍
  10. 项目启动失败解决方法