OIDC中JWK,JWKS的介绍与使用

JWKS全称为 JSON Web Key Set,是指多个JWK组合在一起的一种格式(详见 https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-5 );

JWK全称是JSON Web Key,其标准协议链接:https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41

JWK在OIDC中的主要作用是为JWT(id_token)提供加密密钥,用于加密/解密或签名/验签,是JSON格式的数据。

综上所说,掌握了如何生成JWK,再按照JWKS协议的要求组合起来即可。根据使用不同的加密算法,各种算法的JWK展示内容会有些区别,一个使用RSA算法的JWK格式的数据如下,使用jose4j生成:

{
  "kty": "RSA",
  "kid": "myoidc-keyid",
  "use": "sig",
  "alg": "RS256",
  "n": "xMNL1jDatbHWGDH_H9GZbb2R4Ck2ga-lfE6wJnno_MfqJibSqkiLTZ7P06woJFxzB0WDu2PBe-ptRNoJhEnkzL8c1mgbGOdPVCsaaDm-POGZ3gnWGcyzyuJ9s9km41Rlan3TuuC3HIniY4bmyQAZ-SLwrFk7Bfa91ui4F9S5RvM",
  "e": "AQAB",
  "d": "q73XDM65p8vgll_VUn2NUPcdQ65VUB7y76xzHjJchX8tRj2utUj6pjaPKi_jHdG_6UHouIBa2oEE_QrfMaOZ2wA6LgYPXT_a296LKoOtKKRUlgob_leHxn0FJxLOXtEHgMqDgtMQ1-eFipsFgriip94dmcLEWW3YVK_y5JwJrnE",
  "p": "7OqN19bEbMb9cr9zA98QQq9LOgvQfq5-nOvzwMsubqMosHxViRnivFz2-3LpusK7u2XEG5EljqUxZrf4lgeVmw",
  "q": "1Jy9ksoLuQ5tuc4docgLaXQWqf3iaTm3iC07AA4v9jHzvnkewWFS_PUPPcra4475Dew-y7oIENaRBMijrrWViQ",
  "dp": "HBEdhLh4xLo-RF3R7l96uauyqcnEhX1-mnCJjAmGEq1ZoK7aI0fhyJbq25cdgXaYbvb7aJilbmS7mYOp-3wiiQ",
  "dq": "NRMLn-EgHAomCgQSEZjGgISiQ71FD8-AqVXhLJpeDq9ZkWra6ptJBCyIqXxCOBwwv_EBnAnMiaeGfBM6CRr7QQ",
  "qi": "VCdAeu4h25X_kM69Netc3SKPo5P-1VjeSHz0Ko0QuSMF0INc6H2yi7hZgZuYANVaTF1Ipf6lWfHBLpuRGh3lXw"
}

JWK数据的格式具体可参见 https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-4

主要属性:kty(Key类型),use(两个可选值:sig or enc),alg(具体的算法),kid(Key的唯一标识id)

 

有了JWK数据,只需要按照JWKS的格式组装成对应的JSON数据即可,以上面的JWK组装的JWKS数据如下:

{
  "keys": [
    {
      "p": "7OqN19bEbMb9cr9zA98QQq9LOgvQfq5-nOvzwMsubqMosHxViRnivFz2-3LpusK7u2XEG5EljqUxZrf4lgeVmw",
      "kty": "RSA",
      "q": "1Jy9ksoLuQ5tuc4docgLaXQWqf3iaTm3iC07AA4v9jHzvnkewWFS_PUPPcra4475Dew-y7oIENaRBMijrrWViQ",
      "d": "q73XDM65p8vgll_VUn2NUPcdQ65VUB7y76xzHjJchX8tRj2utUj6pjaPKi_jHdG_6UHouIBa2oEE_QrfMaOZ2wA6LgYPXT_a296LKoOtKKRUlgob_leHxn0FJxLOXtEHgMqDgtMQ1-eFipsFgriip94dmcLEWW3YVK_y5JwJrnE",
      "e": "AQAB",
      "use": "sig",
      "kid": "myoidc-keyid",
      "qi": "VCdAeu4h25X_kM69Netc3SKPo5P-1VjeSHz0Ko0QuSMF0INc6H2yi7hZgZuYANVaTF1Ipf6lWfHBLpuRGh3lXw",
      "dp": "HBEdhLh4xLo-RF3R7l96uauyqcnEhX1-mnCJjAmGEq1ZoK7aI0fhyJbq25cdgXaYbvb7aJilbmS7mYOp-3wiiQ",
      "alg": "RS256",
      "dq": "NRMLn-EgHAomCgQSEZjGgISiQ71FD8-AqVXhLJpeDq9ZkWra6ptJBCyIqXxCOBwwv_EBnAnMiaeGfBM6CRr7QQ",
      "n": "xMNL1jDatbHWGDH_H9GZbb2R4Ck2ga-lfE6wJnno_MfqJibSqkiLTZ7P06woJFxzB0WDu2PBe-ptRNoJhEnkzL8c1mgbGOdPVCsaaDm-POGZ3gnWGcyzyuJ9s9km41Rlan3TuuC3HIniY4bmyQAZ-SLwrFk7Bfa91ui4F9S5RvM"
    }
  ]
}

以上的JWK,JWKS的示例的完整代码(JAVA实现)可在此查看 https://gitee.com/mkk/MyOIDC/blob/master/myoidc-server/src/test/java/myoidc/server/infrastructure/JWKSTest.java。代码中还包括除RSA外,ECC,OCT的示例实现。

 

JWK本身未定义一种新的加密算法或变种,只是定义一种JSON格式的数据展示(更符合互联网传输),其底层实现依旧依赖PKI体系的技术,如x509,公钥/私钥体系。在其协议介绍中能更好地体现出来。

20200920160628

 

如果是使用非JAVA语言,也可以使用对应的PKI技术生成JWK,如openssl;

一个使用JDK自带的 keytool 工具生成的示例如下:

keytool -genkeypair -alias oidc-demo -validity 180 -keyalg RSA -keypass oidc-demo -keystore oidc-demo.jks -storepass oidc-demo

命令输入后依次填写DN的各类信息,即可生成 oidc-demo.jks文件,密码为 oidc-demo,文件中有私钥公钥等信息。

若需要导出为 x509格式数据,使用keytool命令:

keytool -exportcert -keystore oidc-demo.jks -rfc -file oidc-demo.cer -alias oidc-demo

输入密码后生成的 oidc-demo.cer文件为x509格式。

 

2020年阅读计划

阅读自有书,2020阅读计划

  1. 《Effective Java中文版(原书第3版)》2月
  2. 《持续交付:发布可靠软件的系统方法》7月
  3. 《鞋狗:耐克创始人菲尔.奈特亲笔自传》3月
  4. 《论人类不平等的起源和基础》12月
  5. 《新未来简史:区块链,人工智能,大数据陷阱与数字化生活》3月
  6. 《人间失格》2月
  7. 《企业IT架构转型之道》1月
  8. 《和谐拯救危机》
  9. 《演进式架构》11月
  10. 《区块链 领导干部读本》6月
  11. 《译文纪实:血疫》6月
  12. 《基因,大脑和人类潜能》
  13. 《深入分布式缓存:从原理到实践》6月
  14. 《程序员必读之软件架构》4月
  15. 《程序员思维修炼(修订版)》5月
  16. 《深入理解Spring Cloud与微服务构建(第2版)》4月
  17. 《大数据之路:阿里巴巴大数据实践》5月
  18. 《用户故事地图》7月
  19. 《美国独行:西方世界的末日》9月
  20. 《税法禁行线》9月
  21. 《吃,是一种公民行为》8月
  22. 《病毒星球》7月
  23. 《平凡的世界》全三册 7月
  24. 《零信任网络》8月
  25. 《聊聊“架构”》9月
  26. 《第七天》10月
  27. 《晚熟的人》10月
  28. 《阿里巴巴Java开发手册 第2版》11月

 

——————————-

2019年阅读计划

2018年阅读计划

2017年阅读计划

2016年及之前所看之书

《领域驱动设计》摘录

没有哪个项目会用到本书中介绍的所有技术。尽管如此,我们很容易通过几个方面辩认出一个项目是否采用了领域驱动设计。标志性的特征是把“理解目标领域并将学到的知识融合到软件中”当作首要任务。其他工作都以它为前提。

 

他们知道,开发出高质量的,能够清晰反映出领域模型的软件并非易事,因此他们一丝不苟地运用设计技巧。他们也因为遇到障碍而跌倒过,但却始终坚持自己的原则,百折不挠,继续前进。

 

当下,“复杂性”领域是众多科学的前沿。虽然有才能的软件工程师通常都认为纯粹的技术任务是最有趣,最有挑战性的,但领域驱动设计展现了一个同样富有挑战性(甚至具有更大挑战性)的新领域。

 

由外行创建复杂软件的时代还远未到来。

 

创建好的软件是一项需要学习和思考的活动。

 

但不管怎样都不能仅仅停留在“一切都是对象”这种层次上,至少要分清“螺栓”和“弹簧”。

 

2019年阅读计划

阅读自有书,2019阅读计划

  1. 《点石成金:访客至少的WEB和移动可用性设计秘笈(原书第3版)》
  2. 《理解未来的7个原则》10月
  3. 《乌合之众:大众心理研究》
  4. 《无缘社会(译文纪实)》10月
  5. 《Spring Cloud微服务实战》1月
  6. 《浮生六记》10月
  7. 《代码管理核心技术及实践》2月
  8. 《SQL反模式》
  9. 《超越极限》2月
  10. 《生产微服务》3月
  11. 《微服务设计》5月(第二遍)
  12. 《领域驱动设计》5月
  13. 《活着》5月
  14. 《我胆小如鼠》6月
  15. 《生活需要仪式感》9月
  16. 《彩票利益相关方的社会责任》6月
  17. 《创始人手记》7月
  18. 《稀缺.我们是如何陷入贫穷与忙碌的》6月
  19. 《中国式众筹:改变你我未来的方法》7月
  20. 《菜场经济学》8月
  21. 《局外人》9月
  22. 《杜月笙 人心至上》9月
  23. 《省府大院》
  24. 《墨菲定律》
  25. 《Python基础教程(第3版)》11月
  26. 《余生很长,别慌张,别失望》11月
  27. 《阿波罗大揭秘》11月
  28. 《将心注入 一杯咖啡成就星巴克传奇》12月
  29. 《企业IT架构转型之道》12月

 

 

——————————-

2018年阅读计划

2017年阅读计划

2016年及之前所看之书

转:「连接未来」

身份

身份定义个人。

我们来想象一下,如果有一天早上起来,突然发现自己的「身份」完全无法确定了,或者说我的「身份安全」出现了问题,会发生什么。

一早我手机上的闹钟把我叫醒,但设备上指纹解锁的功能突然失效,手机解锁不了。我带着响个不停的手机出门,打开摩拜单车扫码,蚂蚁信用告知我的信用已经归零,交了押金,骑车到了银行来办理房屋贷款手续。银行查不到任何我的征信记录、收入记录或者社保记录,拒贷。走出了银行,手机发出了持续震动,无数条信用卡消费提醒弹了出来,消费地点有巴西、印度、尼泊尔等等,金额巨大。我立刻打车到警察局报警,警察扫描了我的身份证后,说我的身份不存在于中国公民系统中,无法立案。我回到家,打开贴吧想要把我这一天的经历吐槽一番,但是登录一直失败,密码找回,登录上去了之后,发现自己的昵称被改成了别人,自己的账号在今天发了很多八卦帖子。

硬设备、软应用、企业、政府机构乃至国家本身,都会「否认」我。除了我的朋友和亲人以外,甚至都可以无法判别我的存在。

听起来很不错吧?如果上面的情况太极端,我们只需要想象一下身份证或者信用卡如果丢了,我们会有多着急,就能够理解「身份」的重要性了。

现实生活中,每个人的所有系统中的「身份」定义了该个体的存在职能,甚至赋予了个人存在的意义或价值。

你可能认为你知道自己的身份是什么,但实际情况远比设想的要更危险和复杂。在我们进入雷区之前,我们先来回顾一下身份的含义。

所有的共有社会机制,全都是为了服务社会的某种发展倾向而创造出来的。身份也是如此,其本身毫无意义,亦无确切价值,但当和实际的人们需要结合起来之后,它就有了无穷的变种和使用场景。

当人有了私有物品意识,便会希望维持其所有权不受他人侵犯。31,000 年前,在一些有固定规范和共识的小亚细亚部落中,人们将自己的手掌通过雕刻的方式印记在某些物品上,以此来标记身份。在部落成员尽皆认可的情况下,身份用来标记物品所属,是维系私有财产的纽带。

公元前 450 年,各文明古国的规模不断扩张,古波斯一位叫做 Nehemiah 的官员获取到了有史以来第一份旅行文件——「护照」,前往犹大公干。在这个场景中,护照代表着身份,在两国使节未曾谋面的情况下,提供了可信的身份保障,成为了成功对等交流的基础。耳熟能详唐玄奘的通关文牒,与此有异曲同工之妙。

公元 14 世纪,机缘巧合下,商贸盛行的地中海沿岸出现了资本主义萌芽,私有银行开始出现。银行家们将钱小额借贷给平民,大额借贷给政府军政组织,并以收息为利。在这个场景中,与身份挂钩的是背景、权力和信用。当银行家可以确定某个人的身份,就可以对其身份所代表的偿还能力进行评估,继而有的放矢地借贷,对贵族给予更高额度,对贫穷者者关上大门。

1986年,中国通行现代身份证系统。在那之前,如果要证明身份,除了户口本以外,还需要携带档案、介绍信,甚至需要相熟之人互相介绍才能顺利,而身份证出现了之后,一切需要使用居民身份的场景:火车验票、银行开户、办理驾照、申请工作、居住上学等等流程也都随之简化,继而普及开来。

上面四个例子从古到今描述了使用了身份的四个场景,实际上也体现了身份在四个方面的作用,依次为「权属」、「交流」、「信用」和「社会」方面。

「权属」或者「权限」是最直观的身份的作用,表示了人和物之间的关系,而当资源出现富余,非劳动性质工种出现后,会出现贸易、战争、外交、宗教等复杂的人与人之间的「交流」,部落画地为圆成为了城邦和国家,由身份开始演变出地位、权力和财富。工商业的发展促生了资本主义,于是一个人的身份上又捆绑了更多的概念:「信用」、权益、还款能力、存款量等等。而进入了现代,社会的发展和保障体系愈发完善,与整个国家相对应的「统一身份」体系出现了,在国家范围内,身份证件打通了同一个自然人在不同国家系统中的各个身份,在某种程度上得到了身份与认证的完整统一,而随之而来的,是社会效率大幅增高、社会发展进程急速加快。

可以看得出来这四个层面并非是随机顺序,而是按照着人类文明的进程而逐次展开,随着人类社会的广度和深度在不断延伸,「身份」作为社会基础元素的功能也不断地进化发展。每当有突破性的技术发展或社会变革的时候,身份就会随之在新的世界中有了新的、不断累加的定义,其重要性也随着社群范围扩大、系统愈发多样复杂而急剧提升。

每当世界或某些特定场景发生了重要变革的时候,身份系统作为基本属性,也会随之发生进化。变革越巨大,进化也就越明显。

而当前的世界,正正处在历史上最巨大的变革之中。


变革

世界每次革命的起源,都是基础技术和理论的发明、稳定并且推广所带来的,而初始研究基础的人,对他们所研究事务的未来影响力,往往毫无概念。很少有人意识到,身份安全作为「信息化」革命的底层基础,到底有着多么特殊的重要性,也因此,这个话题值得我们去深入探讨。

「信息化」变革有诸多特性,不一而足,最明显也最基础的,是「数字化」。

数十年前,随着基础网络技术的不断拓延,最基础的书籍资料等最开始被数字化保存,之后邮箱的出现代表着网络超低成本超距交流的出现,再往后随着互联网的出现和成熟,一批批的渗透到我们生活方方面面的硬件和应用软件前赴后继而来,周围一切牵扯到数据和交流的机制,正在以不可阻挡的速度完成它们各自的数字化进程。

实在太快了。

人类历史记录中并无这种短时间内翻天覆地的记录,社会的有机自适应力远远跟不上时代的变迁。

在历史中,我们有数百、上千年甚至上万年的时间来消化某一项历史进程带来的革新,有充分的缓冲来释放新技术新理念带来的突破性压力。而现在,数千年的沧海桑田被压缩成了十年光怪陆离,技术革新带来的突破像气球内的不断生长的针尖,时刻在挑战试图爆破。

海量的数据和系统正在不顾一切地迁移到网络中,好尽快开始享受网络带来的巨大便利、低廉成本和规模化效应,不仅仅是一些相对无关痛痒的娱乐、咨询、交际等轻应用,很多军事、政府机构数据、金融、财务、征信体系、个人隐私、保密数据也同样接入了这巨大的网络社会中。

很少有人意识到在这繁花紧簇之下孕育的巨大危机。

你看到问题了吗?

当身份问题最多只能导致社交网站信息泄露,邮箱无法登录,或者游戏平台账号被盗窃使用的时候,我们并不会太过惊慌,因为这些应用与现实社会的接触面并不太广,能造成的损失也非常有限。然而,随着巨大车轮的运转,随着诸多更严密的场景、数据、应用的数字化,网络世界和我们真正生活愈发纠葛不清,风险可能造成的损失也成倍增加。

很多人开始拥抱各种IoT技术产物,能否设想一下,如果烟雾探测器被强制登录并手动触发了警报,会发生什么?如果在自动驾驶过程中GPS信号被劫持到了塔克拉玛干沙漠中,会发生什么?如果自己家的智能门锁认证机制被攻破,任何人的指纹都可以验证通过,又会发生什么?而我们作为新鲜事物尝鲜者,在应用落地相对早期,在相关规定法律条文仍未成型的时期,真的可以维护自己的生命财产安全吗?

和很多人设想的不同,身份保障是一套完整的体系,并非是在某些聚焦点做好就足够的。我们知道,某些城市中,所有交通路段的监控摄像头,访问使用的都是统一的默认密码,而默认密码,就写在摄像头设备的背面。也就是说,理论上只要知道摄像头的公开访问地址,并且拿把梯子爬到摄像头背面照张相,就能够访问到整个城市的交通设想体系中,并进行监控、篡改甚至破坏。

是摄像头的安全质量不过关吗?不见得。任何有密码的产品在说明书中都会要求用户尽快重置密码,无论多么有效的安全体系,都禁不住没有形成安全观念、未受到安全使用教育的使用者故意或无意的滥用。

那么问题的根源就在于我们整个社会对身份安全的教育不够吗?不,这仍然只是症状而非病因。

最大的风险,不是来自于危机有多么严峻,而是源于我们对其有多轻视。我们如果仍然以淡然处之的心态,对待在新社会形态中身份安全问题,就一直不会去弥补漏洞、寻求进步,风险就会永远一直存在,而且会随着使用场景越来越广而越来越危险。

商业未来是什么样子的?我们相信,一千个人眼中会有一千种哈姆雷特,但是有一点是共识的:

Everything that we will do in the future is all about delivering a personalized experience, and the cornerstone of personalization is identity management.

——Scott Howitt, MGM CISO

几乎任何商业业态在未来都会进行更加细化的划分,目的是为了为每个人提供定制化的体验或服务。而这未来商业「长尾」化的基石,就是身份管理和身份安全。(笔者译)

板上钉钉、无可更改、无可抵赖地确定你是谁。

而确定你是谁,正在变得无比缥缈和复杂。


现况

我们举个例子,来设想下,如果邮箱密码泄露了,会发生什么。

在很短的时间内,黑客可以把所有邮件以及它们的附件全部抓取下来,并且可以从邮箱账号的用户信息栏获取到邮箱拥有者的性别、年龄、学历、联系方式等基本信息。

在把邮件进行简单过滤以后,能获取到每个月的信用卡账单信息,能看到日常工作记录和项目交流记录,能获取到朋友之间的某些隐私图片或者视频。在查看历史记录后,黑客可以冒充受害人,向受害人的亲朋或同事发一封借钱的邮件,也可以利用这个邮件不留痕迹地去注册一些违法乱纪的网站。

很多常规网站在使用邮箱注册了以后,会向邮箱中发送验证码或者欢迎邮件,黑客以此可以得知用户都在哪些网站用这个邮箱进行了注册。黑客可以去这些网站尝试使用同样的邮箱和密码进行登录,80%的可能用户在不同系统之间使用的是相同或至少是类似的密码,所以很可能黑客可以登录很大一部分受害者日常使用的网站或应用服务。

而如果某个应用开启了邮件二次确认的话,由于邮件的访问权限已经透明,二次确认的手段可能也会被绕了过去。如果不牵扯到金钱的话,大多数系统都不会有非常成熟的足够安全的保障体系。到这一步,很多应用的访问都会被攻破,而根据这些被攻破的网站的业务不同,同时又开放了这些或高或低的新的业务权限给黑客,让黑客可以从这次单点突破中获取到更多的有效信息,牵连到更广泛的场景或更多的人,最后仍然可以将该邮箱账号信息售卖以换取基本利润。

当我们的身份证或信用卡遗失之后,我们会非常焦急紧张,食不知味夜不能眠,生怕有人会以此为恶,造成自己的损失。

但是如果是邮箱密码被盗窃了,很少有人会紧张。如果收到通知(如果邮箱系统有能力进行入侵检测并发出告警通知的话),可能也就是改个密码就足以心安了。与此对比,当现实中门钥匙遗失之后,甚至有人会考虑换一把门锁来确保安全。

在现在的网络环境中,邮箱不仅是一个发送邮件进行交流的地址,而也同时代表了个人的身份。邮箱可以绑定有个人的银行信息、工作信息、隐私机密信息,很多应用系统使用邮箱进行多因素认证、身份确认或密码找回。很多系统的身份安全体系都建立在稳定的可确定的邮件系统安全之上。邮箱作为虚拟网络世界中最典型的身份安全核心之一,一旦被突破,后果会有连续的深远性,随着与其绑定的业务种类越来越多、越来越核心,其后果甚至可能会超过身份证的遗失或伪造。

人们对此的认知严重缺乏、反应异常缓慢,在社会发展大车轮在持续加速碾压向前的时机,也就给黑客的入侵提供了天然的土壤。

在关键政府机构的门口都可以看到武装军官站岗,但在很多关系到社会民生甚至军国大事的网络访问的虚拟大门口,并不会指派专人严阵以待。

而在信息化的过程当中,后者的重要性愈演愈烈。

在现代网络出现以前,只有「国家」、「工作」、「学校」等等非常少数的「应用系统」存在,因而身份是贫瘠的。三两个同根同源的系统之间,如果希望将他们的身份体系打通,并不会有太大的困扰,人们在大多数生活场景中,也无须担心身份的确认或关联问题。

而现在,依靠着互联网的超距便利,每天都有成千上万个「应用系统」井喷而出。在工作场景、在学校场景、在私人场景、在娱乐场景等等都有着无穷多的应用繁花簇锦而来,在这些应用争宠般抢占使用者的精力和时间的时候,同时对身份安全造成的巨大而难以弥合的紊乱。

这是历史中从未发生过的巨大的观念性的身份变革。

现在,见面打招呼不再应该是递名片了,而是应该递一张纸条,并介绍说「这是我的 IP 地址,我的 MAC 地址,我的 GPS 定位,我的用户使用画像,我的微信号、百度贴吧账号和 github 账号和我的指纹。这就是我,很高兴认识你。」

但可惜的是,历史没有教导我们如何处理新鲜事物,它只用它笨拙的惯性思维,促使我们尝试用旧有的方式解决全新的问题。

一个用户使用各种各样的不同应用,于是,每个单独的应用有了各自的身份系统,而这些身份系统互不相干,尽管这些身份系统对应的现实的自然「人」,只有一个。在这基础之上,只有单系统的「身份认证」作为基础,已经无法满足动态应用场景,「多身份治理」开始走上了舞台。可以这样说,「多身份治理」是我们从「单一身份」到「统一身份」的一个过渡状态。历史上,所有事物的处理核心都是人,今天,无论应用多繁杂,核心仍然是人,未来亦如是。这点未变,也不可能改变。在现在应用变得多元而发散的情况下,一个用户的身份有明确的化为一的趋势。

身份曾因贫瘠而「唯一」,未来将随技术发展成熟而最终「统一」。

趋势无法质疑。


理念

身份系统有两个很有意思的基本特点。

一、和系统业务基本无关。大多数应用中只是需要有一个身份来进行用户标识而已,在很多应用软件公司中,身份安全纯属鸡肋,不能帮助业务带来收益,但是又不可能丢开。

二、非常复杂。一个真正安全的身份系统的复杂度,甚至会超过很多应用系统本身,投入的人手专业性要求非常高,耗费巨大。

绝大多数人,包括很多技术人员和管理者,都对身份系统的重要性没有任何清晰的认识,也就不会愿意投入大笔资源到他们看来不能产出同等效益的功能中。是这一点,导致了良好身份系统的普及缓慢,接受度仍然低下,但也正是因为明晰地看到了这一点,我们九州云腾找到使命并应运诞生。

导致市场普及度低下的这同样的两个原因,换个角度看,又同时代表着身份服务的产品价值和竞争壁垒。九州云腾能够为产品、企业和开发人员提供完整的安全统一身份产品和定制化解决方案,我们有专业的人员和产品,来保障我们所有客户和用户的身份安全。

世界并不缺乏先进的技术。我们已经有了针对于各个不同场景、情况下的身份统一的协议和方案,相当于网络发展过程中 TCP  IP 协议已经发展成熟。我们并不缺乏实际解决问题的手段,但是市场仍然缺乏足够的认知,行业仍然缺少先行者的推动。在将成熟的技术、完善的解决方案推广到相对落后封闭的系统的过程中,将会有非常严苛的克服障碍、披荆斩棘的过程,但同时也会产生瀑布般巨大的势能,并为创造者和先驱带来荣誉、机会和财富。

我们再展开去看,身份的未来会是什么样。

这个话题太广,我们不妨类比下万维网诞生过程,就从单一角度去看。在万维网出现之前,各个虚拟系统之间像是海上漂流的「孤岛」,老死不相往来,用户使用应用系统受限于资源、数据存储和地址位置的约束,打开电脑,只有电脑最基础的功能,以及在一些特定场景下内网的简单机器网络。

而到了万维网发明几年后,大众、甚至一些行业专家,都仍然看不到万维网的具体应用是什么,有电视主持人在节目中当众嘲讽电子邮件的应用。很多人无法理解,电脑可以用驱动安装软件,办公学校等场景有局域网、内网,一切都已经便捷了这么多,为什么还要继续互联呢?为什么要用电子邮件,而不是直接寄信呢?

互联网无疑是一片肥沃的土壤,但只有在这片土壤被深深耕耘之后,上面才会孕育出智慧之果、价值之实。又有谁能预想到,万维网在短短 20 年内会造就今天?

统一的、可信的身份系统是能够允许人们接触未知的先提条件,它允许了陌生人和陌生人、陌生人和陌生系统之间的交流有一个基本的、可靠的基础。在远古的历史中,如果没有可信的身份系统,人类走不出依靠强关系维系的部落时代,最大的有组织的社会将只有数百人。

连接产生交流,碰撞创造伟大。

而当下,所有的身份系统支离破碎,各自为政。我们也不妨畅想一下,当身份结成网络,当每个人在整个网络体系中的所有身份可以确定并且统一的时候会发生什么。我们的所有行为和操作将成为度量我们身份的标识,任何新服务都可以直接调用查看我的信用;摩拜单车、租房不再需要押金;贷款、申请信用卡等都不再需要填表申请;我在网页上的广告将精准地完全按照我的喜好和需要而展示;我在浏览视频网站的时候,也可以弹出来一个窗口,提醒我信用卡应该还款,或我的航班即将起飞。

一个人的虚拟身份将由其使用的所有应用中的身份网交织而成,统一而又可以去中心化。而人与人的身份之间,又会再次成网。应用身份系统的网络可以做到以统一身份为核心的数据流通,而人与人之间的身份网络会将身份的革命推向高潮,真正实现可以将现实社会中的组织、交流、社会机制完全映射到虚拟世界中去。

个人的虚拟身份将会可以像身份证一样有着实际、甚至更可靠的意义,而在这变革的前后,社交、娱乐、金融、广告、保险、医疗等等行业甚至包含政府在内,也会发生翻天覆地的变化。

身份是钥匙,而一个人的身份从来不「重置」、「退出」或者「宕机」,身份与人如影随形,24*7,无论你是否在线。

眼下,由于国家政策的上层合规推动,和企业场景内愈发复杂的应用环境和「云大物移」的趋势,我们的身份服务正在有针对性地解决特定场景的特定问题。而毫无疑问,特定场景会变成普遍场景,特定问题也会降临到普通用户的使用上。

 

在市场走向成熟的过程中,九州云腾的身份安全产品也会紧紧伴随其脚步。身份服务将会成为虚拟世界中类似衣食住行的基础服务,不光鲜但绝顶重要,消失不见而又无处不在。


连接未来

人独特而自由,而你真正是「你」的权力,是我们保护的理念,是我们创造的信仰。

我们是谁?我们是软件工程师,我们是安全专家?我们是UI设计师?我们是产品项目管理者?我们是市场和销售?不不不,我们到底是谁?是歌手?是球星?是猎手?是登山爱好者?是吃鸡团队?

我们远超于此。充沛的创造力,深厚的经验,卧薪尝胆的耐心和胆气,拥有身份安全专业知识的武装,老成持重又随时进化发展,我们是保卫者,是守望者,是革新者。

九州云腾,连接未来。

logo

 

原文链接: https://mp.weixin.qq.com/s/o9NNfY7xGWJreCKmlI10kg

各类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