各类JWT库(java)的使用与评价

https://jwt.io/ 网站中收录有各类语言的JWT库实现(有关JWT详细介绍请访问 https://jwt.io/introduction/),

其中JAVA语言到目前(2018-06)有6个实现库,如下图:

jwt

按顺序依次是

Auth0实现 的 java-jwt

Brian Campbell实现的 jose4j

connect2id实现的 nimbus-jose-jwt

Les Haziewood实现的 jjwt

Inversoft实现的prime-jwt

Vertx实现的vertx-auth-jwt.

 

以下是各个库的使用测试

java-jwt

oauth0

完整测试链接  https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/Auth0JwtTest.java

点评:

Auth0提供的JWT库简单实用, 依赖第三方(如JAVA运行环境)提供的证书信息(keypair);

有一问题是在 生成id_token与 校验(verify)id_token时都需要 公钥(public key)与密钥(private key), 个人感觉是一不足(实际上在校验时只需要public key即可)

 

jose4j

jose4j

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/Jose4JTest.java

点评:

jose4j提供了完整的JWT实现, 可以不依赖第三方提供的证书信息(keypair, 库本身自带有RSA的实现),类定义与JWT协议规定匹配度高,易理解与上手

对称加密与非对称加密都有提供实现

 

nimbus-jose-jwt

nimbus

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/NimbusJoseJwtTest.java

点评:

nimbus-jose-jwt库类定义清晰,简单易用,易理解 , 依赖第三方提供的证书信息(keypair), 对称算法 与非对称算法皆有实现.

 

jjwt

jjwt

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/JJwtTest.java

点评:

jjwt小巧够用, 但对JWT的一些细节包装不够, 比如 Claims (只提供获取header,body)

 

prime-jwt

primejwt

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/PrimeJwtTest.java

点评:

prime jwt库怎么说呢, 有些地方不符合JAVA语言规范, 支持对称算法(HMAC) 与非对称算法(RSA), 也算容易理解

 

vertx-auth-jwt

vertxjwt

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/VertxAuthJwtTest.java

 点评:

Vertx Auth Jwt 库算是最不容易理解的一个库了.花了不少时间才弄通这一示例. 不容易上手. 并且生成与校验id_token 时都需要公钥与私钥,不足.

 

———————————————————

以下是在使用中的一些总结或注意点

1. 几乎所有库都要求JAVA版本1.7或更高版本, 1.6或以下的版本需要二次开发(或不支持)

2.从易用性, 扩展性, 完整性等来看, 使用首先推荐 jose4j, 其次是 Nimbus-jose-jwt.

3. JWT是实现OIDC的基石,掌握其使用对实现OIDC有很大帮助(同时对JAVA证书使用, PKI体系的掌握也有要求)

 

 

https://github.com/monkeyk/MyOIDC

spring-oauth-server 2.0.0 发布,使用Spring-Boot2.0实现

经过一年多的时间后,我们发布了 spring-oauth-server 2.0.0版本.

使用Spring-Boot 2.0版本重构, 进入模块化,零配置时代. 更符合技术发展与实际需要.

相比之前的版本(1.0及之前版本), 更新如下:

1. 全新的 Spring-Boot风格

2.ClientDetails中的 client_secret 字段加密保存

3.密码加密方式由MD5变成 BCrypt

4.增加CSRF机制支持

5.resourceId变为可选(但建议使用固定的resourceId)

https://gitee.com/shengzhao/spring-oauth-server/tree/2.0.0/

mvn install 本地jar

仅此一命令, 记录下来常用.

mvn install:install-file -DgroupId={groupId} -DartifactId={artifactId} -Dversion={version} -Dpackaging=jar -Dfile={xxxx}.jar

 

私有lib配置 (pom.xml)

<repositories>
    <repository>
        <id>basedir</id>
        <url>file://${project.basedir}/lib/</url>
    </repository>
</repositories>

 

Spring Security 5中 PasswordEncoder的使用

在最新的 Spring Security 5发布版本中, 出于安全性的考虑调整了PasswordEncoder的实现与使用策略.

1.以前常用的实现 StandardPasswordEncoder, MessageDigestPasswordEncoder, StandardPasswordEncoder 不再推荐使用, 全加上了@Deprecated ,并有具体的说明

1

推荐使用BCryptPasswordEncoder, Pbkdf2PasswordEncoder, SCryptPasswordEncoder等

 

2.增加 PasswordEncoderFactories 类提供一个静态方法 createDelegatingPasswordEncoder()方法, 使用委托方式创建PasswordEncoder的实现

2

在此方法的实现中,实际上使用了 BCryptPasswordEncoder 作为默认的实现(我想, 这也是Spring Security团队推荐使用的吧).

 

3.关于加密salt(盐值)的变化. 在之前的使用中, 一般在使用时自己指定salt值,一个配置示例如下:

3

而在新的使用中, salt的实现 将由各具体实现类去处理(如使用随机生成的值), 以 BCryptPasswordEncoder的实现说明

4

如图,在进行加密时, 使用随机生成的salt值或由指定的 strength, random去生成.

比如原密码为 admin, 分别进行两次 bcrypt加密的结果如下

$2a$10$OEaUDkvTlWY/BpoAL7f.H.X7Cz9x3OR3pfWv5wasidP4B7izvyRy6
$2a$10$BBFV5eyg4YoBLThOzi1bDO0WYDBCzcLq3ISokgzxCB/CM0YTXHrha

里面也有 salt 的作用.

 

 

以上为使用 Spring Security 5中 PasswordEncoder的变化总结, 希望对你有用.

当然, 更安全的加密可以使用基于Spring Security提供的类去进行扩展自己的PasswordEncoder实现

Java HeartBeat 2.0.0 发布,心跳检测应用服务器的Spring-Boot程序

Java HeartBeat 2.0.0版本已经发布, 使用Spring-Boot框架, 全新的”零配置”设计,向微服务化靠近,抛掉沉重的XML配置文件.Java HeartBeat 是心跳检测应用服务器(如 Tomcat,Jetty)的 Java Web 应用程序。

2.0.0版本主要更新如下:

1).使用 Spring-Boot 框架重构, 向微服务靠近
2).使用log4j2替换旧的log4j
3).更新登录页面样式,增加版本显示
4).单元测试使用Junit替换旧的TestNG
5).Sitemesh使用3.0版本替换2.0版本

HeartBeat 2.0.0版本访问地址: https://gitee.com/mkk/HeartBeat/tree/V-2.0.0/

https://gitee.com/mkk/HeartBeat

读了《史蒂夫·乔布斯传(修订版)》(3)

“动力来自产品,而不是利润”
人们不知道想要什么,直到你把它摆在他们面前
创新中深藏着一种人文精神

然后产品的质量就变得不那么重要了.这些公司开始重视销售人员,因为是他们在推动销售,改写收入数字,而不是产品的工程师和设计师
他们不愿意费力气打造一家真正的公司,而这正是商业领域里最艰难的工作

我们相互间诚实到残酷的地步
如果你不忙着求生,你就在忙着求死
我们试图用我们仅有的天分去表达我们深层的感受,去表达我们对前人所有贡献的感激

或许他们是别人眼中的疯子,但他们却是我们眼中的天才.因为只有那些疯狂到以为自己能够改变世界的人,才能真正改变世界.
job

2017-12-11

2018年阅读计划

阅读自有书,2018阅读计划

  1. 《创新者的窘境》1月
  2. 《创新者的基因》5月
  3. 《鞋狗: 耐克创始人菲尔·奈特亲笔自传》
  4. 《那些古怪又让人忧心的问题what if?》2月
  5. 《硅谷百年史第3版 创业时代 创新时代 互联网时代(套装共3册)》
  6. 《周恩来转(精装典藏版)》6月
  7. 《李嘉诚:我一生的理念》6月
  8. 《点石成金:访客至少的WEB和移动可用性设计秘笈(原书第3版)》
  9. 《丝绸之路: 一部全新的世界史》
  10. 《细节: 如何轻松影响他人》
  11. 《逆向管理: 先行动后思考》4月
  12. 《金字塔原理: 思考, 表达和解决问题的逻辑》
  13. 《创华为: 任正非传》3月
  14. 《创京东》3月
  15. 《读者》2017年冬季卷  4月
  16. 《身份危机》4月
  17. 《黑天鹅》5月
  18. 《道德经》
  19. 《区块链-新经济蓝图及导读》
  20. 《架构解密-从分布式到微服务》6月

读了《史蒂夫·乔布斯传(修订版)》(2)

“在人生的头30年里,你培养习惯;在后30年里,习惯塑造你” —乔布斯
报偿

一家伟大的公司给人的第一印象就必须映射出自己的价值观
Love is just a four-letter word
物质只把生活填满而不使之充实

产品是有灵魂的,是为了一个使命被生产出来的
此刻的失败者终将胜利

他一直确保他们是忠诚的,即使是对错误的忠诚
“苹果有很多出色的人才,但是他们在做错误的事情,因为计划本身就错了” —乔布斯

如果你不热爱这件事,那么你就不会多走一步,也不情愿在周末加班,只会安于现状
“分支”这个词本身就不吉利

永远不要害怕内部相残
与其被别人取代,不如自己取代自己
<<创新者的窘境>>

集思会
数字生活带来的孤立感

创意产生于自发的谈话和随机的讨论中
现实扭曲力
“我来给你们讲个故事吧”

job

 

2017-12-10