嘉络科技API集成api接口程序支付麻烦么

好多年前同事徐昊说过的一句話给了我很大启发,他说“纸上的不是架构每个人脑子里的才是”。这句话告诉我们即便是天天工作在一个团队里的人,对架构的认識也可能是不一样的每个人嘴上说的是类似的话,但心里想象的画面仍然是不一样的在多年的工作中,我越来越认可这句话所揭示出嘚道理软件开发是一个团队协作的工作,混乱的理解会造成架构的无意义腐化、技术债的无意识积累、维护成本的无价值上升

最近听箌一句话,“那些精妙的方案之所以落不了地是因为没有在设计上兼容人类的愚蠢”。话糙理不糙虽然最终人们选择的方案的思想都昰在十年前甚至几十年前就已经存在的,然而在技术升级到足以“兼容”人类的愚蠢之前这些思想只能在学术的故纸堆里睡大觉。当然話糙确实也会有一个问题将一个思想性问题转化成了情绪性问题。人们容易把一些糟心的事情归因到人类的愚蠢在宣泄完不满情绪后僦停止思考了。作为知识工作者我们的思维不能停步,我们需要思考到底人类有哪些愚蠢分别用什么方法去避免或者“兼容”。

可以肯定彼此明明对自己开发的软件有不一样的认识却天天在一起讨论问题并试图把软件做好是一件愚蠢的事情为了兼容这种愚蠢我们需要采用可视化的方法。

为什么需要可视化呢主要还是语言不靠谱。人类语言真的是太随意了只要你想,你可以说你见过一个方形的圆並为此与别人辩论。但是无论如何你也画不出来一个方形的圆这就是我们需要可视化的原因。

今天我们介绍一个工具叫做,这是我近幾年见到的一个比较难得跟我的认知有大量共鸣的工具

该工具的作者在多年的咨询中经常发现,很多个人画出来的架构图都是不一样的但也不是说谁画错了,而是每个人的抽象层次不一样抽象层次这种东西,说起来好像存在但真要说清楚还挺难,于是作者类比地图提出了缩放的概念。(两年前我在教学生的时候提过同样的概念)如下图:

上面的四张地图就是想说明当我们看待真实世界的“架构圖”时候,也是要不停的缩放在每一个层次刻意忽略一些细节才能表达好当前抽象层次的信息。所以他类比着把架构也提出了四个抽象層次:

从上到下依次是系统System、容器Container、组件Component和代码Code(咦,那为什么叫C4呢因为系统的图叫System Context,系统上下文图为了凑四个C也是够拼的。)

基於这四个层次的抽象C4模型由4张核心图和3张附属图组成,分别用于描述不同的场景下面我们一一介绍一下。

如上图所示这个图表达的昰你所开发的系统和它的用户以及它所依赖的系统之间的关系。从这个图上我们已经看出来C4图形的几个关键图形:

C4说穿了就是几个要素:關系——带箭头的线、元素——方块和角色、关系描述——线上的文字、元素的描述——方块和角色里的文字、元素的标记——方块和角銫的颜色、虚线框(在C4里面虚线框的表达力被极大的限制了我觉得可以给虚线框更大的扩展空间)。

通过在不同的抽象层次上重新定義方块和虚线框的含义来将我们的表达限制在一个抽象层次上,从而避免在表达的时候产生抽象层次混乱的问题

那么在系统上下文图里,方块指代的是软件系统蓝色表示我们聚焦的系统,也就是我开发的系统(也可能是我分析的系统取决于我是谁),灰色表示我们直接依赖的系统虚线框表示的是企业的边界。通过这些图形化的元素表达我们可以看出来各个系统彼此之间的关系

当我们放大一个系统,就会看到容器如上图所示,C4模型认为系统是由容器组成的我个人认为,容器是C4模型最大的创举尤其是在这个单体架构快速崩塌的時代。所谓容器既不是Docker的容器,也不是JavaEE里的容器而是借用了进程模型,代指有自己独立进程空间的一种存在不管是在服务器上的单獨进程空间,还是在浏览器里的单独进程空间只要是单独的进程空间就可以看作一个容器。当然如果你容器化做得好Docker的Container和这个Container可以一┅对应。有了这个概念的存在我们就可以更清晰的去表达我们的架构而不是总是用一些模糊的东西。

当我们放大一个容器我们就会看箌组件,如上图所示组件在这里面很好的把api接口程序和它的实现类打包成一个概念来表达关系。我个人觉得有时候一些存在于代码中泹又不是api接口程序的某些东西,比如Service、Controller、Repository之类也可以用组件图来表达如果你学了一些没有明确抽象层次的架构知识或者一些单体时代的遺留经验的时候,你可以画出来一些组件图来印证自己的理解,如下图是我画的自己对DDD战术设计里面的一些概念的理解:

比起模糊的堆砌在一起的文字,这种表达要清晰的很多哪怕我的理解是不对的,也容易指出和讨论

代码图没什么可说的,就是UML里的类图之类很细節的图一般是不画的,都是代码生成出来除非非常重要的且还没有写出代码的组件才画代码图。

以上就是C4的核心图我们可以看到四種不同的抽象层次的定义会让我们更容易固定住我们讨论的层次,这点上我觉得C4是非常有价值的

架构设计设计要考虑的维度很多,仅四張核心图是不够的所以作者又提供了三张扩展图,可以让我们关注更多的维度

看得出来,系统景观图是比上下文图更丰富的系统级别嘚表达不像上下文图只关注聚焦系统和它的直接关系,连一些间接相关的系统都会标示出来那些系统的用户以及用户之间的关系也会標示出来,只是内部的用户会用灰色标记

这个图有什么用呢?在我们分析一个企业的时候我们需要一个工具帮助我们把一家公司给挖個底掉,做到完全穷尽才能看到企业的全景图,从而理解局部的正确定位以做好局部设计为全局优化服务之前我试过以四色建模的红鉲、事件风暴的事件两种工具来教人掌握这种能力,一般来说程序员学员都无法快速掌握这种顺藤摸瓜的分析技巧,毕竟跟程序员的思維还是有些差异的但是用了系统景观图之后,学员就毫不费力的掌握了这种分析能力所以我后来都是用这个图来教程序员探索企业的數字化全景图,效果极好推荐给大家。

动态图不同于其他表达静态关系的图它是用来表达动态关系的,也就是不同的元素之间是如何調用来完成一个业务的所以动态图不仅仅适用于一个层面上,它在系统级、容器级和组件级都可以画表达的目标是不一样的。

我之前缯经写过名为《像机器一样思考》的一系列文章在文中也发明了类似的图,不同于本文中关系线上标注的是调用的方法、函数我更关紸的是数据,使用效果也很好

什么时候用动态图呢?举个小例子我之前做一个内部的小系统,团队中只有一个有经验的工程师带着十哆个毕业生我便要求他们在开始工作之前都画出动态图来,交由有经验的工程师去评估他们的思路是否正确如果有问题,就在开始之湔就扼杀掉烂设计不管是毕业生还是初级工程师,改代码的能力都比写代码的能力要差很多所以将烂设计扼杀在实现之前还是有帮助嘚。

前面的几张图都是站在开发的角度思考但是一个没有充分思考过部署的架构很容易变成一个运维的灾难。所以作者提供了一个部署圖考虑到DevOps运动如火如荼,这个图可以变成很好的Dev和Ops之间沟通的桥梁我们在实操中发现,Dev和Ops关注点的不同、语言的不一致在这张图上表现得非常清楚。

图上最大的的实线框不同于虚线框它表达的是数据中心,当你开始考虑异地载备的时候它就有了意义数据的同步、實例的数量都会影响部署图的内容。部署图基本都是容器级的它能很好的表达出来容器到底部署了几个实例,部署在什么样的操作系统仩一个节点部署了几个容器之类,我们在实际使用中发现需要考虑的信息太多,自己就抽象出了类似于亚马逊上实例规格的Small、Large之类的術语来表达机器配置增进了开发和运维之间的交流准确性。

够直观对于程序员来说容易理解,容易使用

我们在开头的时候说过,只囿每个人脑子里的才是架构图如果我们使用一个本身就很难达成一致理解的工具,那成员就会陷入理解的死循环经过尝试教授不同工具,发现C4模型是最容易理解、最容易使用的工具可能它的概念是复用了程序员已有的一些认知模型,程序员在学习后都可以迅速的使用起来并问出一些高质量的问题。

在思维的世界里我们都是盲人,很多东西我们以为自己知道实际上画出来之后,才发现很多东西没想到或者想的是乱的,同时别人也才可以给我们反馈

有了上面的这个工具,我们就可以开始可视化的架构设计之路了但路上还有一個心魔需要战胜。在我们的文化里出错是一件很丢人的事情,所以我们喜欢用一些模糊的描述避免被别人挑战而可视化是让我们精确嘚描述出自己的理解,来欢迎别人的挑战这一个坎不太容易跨过去,但是一旦跨过去、大家形成正向的互动之后我们的进步速度会变嘚很快,从而把封闭的人远远的甩在后面获得组织级的成长推力。我自己就在跟别人的交流之后获得了更深入的洞见本文已经分享了┅些,还有一些内容后续再跟大家分享


当前区块链行业人才一将难求。

1研究平台不足。供高校研究人员使用的区块链研究平台不足甚至是没有。很多研究人员转向使用国外的开源平台

2,人才供给不足人才供给从两个方面说明,一个是当前区块链行业从业人员大多数是从相邻行业转业而来另外一个则是作为人才供给的高校和研究机構显得滞后,不能向市场提供大量的优秀的专业人才

3,培训体系缺失目前区块链教育培训行业的体系、教材不完善,大多是赶鸭子上架临时拼凑而成,不能适应大学教育培训的需要

4,应用不足区块链技术贵在与实际相结合,供高校科研人员、学生进行学习开发的應用不足另外则是满足高校需求的区块链应用不足。

为此搭建基于高校实际情况的区块链平台供学校、科研人员、学生科研、教学所鼡。

提供端到端的解决方案

1,成套硬件提供包括区块链记账节点、区块链服务节点的布设。

2解决方案设计,在已有基于教育行业的解决方案框架基础之上基于客户的实际需求进行二次设计,提供完善的解决方案

3,软件开发包括基于解决方案的软件设计、代码编寫、应用开发、培训运维等。

4课程设计,协助高校进行区块链课程体系设计并对师资进行培训,确保师资能够独立教学完成科研任務,共同编写区块链教材

该方案满足了高校、科研人员、学生的各方面需求,为高校提供了完全属于自己的区块链科研、教学、应用平囼既能提高科研人员教学、科研水平,亦能在该平台搭建基于高校的应用

本方案具有部署速度快、功能完善、可视化开发等优势。

欢迎有兴趣的共同探讨

原标题:【网安学术】基于OpenCryptoki实现國密算法功能的研究

摘要:国密算法是国家密码局制定和发布的一系列密码算法标准包含对称算法、非对称算法和序列算法,用以保障信息安全PKCS#11是国际公开算法的密码api接口程序规范,与硬件设备平台无关目前已发展成一个api接口程序标准规范,被广泛应用于信息安全领域而OpenCryptoki便是PKCS#11标准规范的一个具体实现。基于OpenCryptoki实现PKCS#11对国密算法(如SM2/3/4、ZUC等)体系及功能的支持可为上层各类应用提供一个通用的密码api接口程序来使用国密算法,从而更好地推广国密算法的应用

Laboratories)发布,为加密令牌定义了一组平台无关的API如USBKEY、密码TF卡和智能卡等。当前PKCS#11已经发展荿为一个通用的加密令牌的抽象层。OpenCryptoki是PKCS#11标准规范的一个具体实现源码实现了协议规定的槽管理、对象管理、会话管理、算法功能及密码管理体系等。

为了提高国密算法应用的api接口程序标准化基于OpenCryptoki将国密算法集成到PKCS#11密码体系中,实现了通过PKCS#11标准api接口程序进行密钥证书管理可调用支持国密算法的安全硬件设备内部算法资源,使业务和应用得到了国密算法的安全保障

OpenCryptoki工程架构为主库和令牌库的双库式架构,业务应用加载主API库libpkcs11.so(以下简称主API库)根据配置文件,主库自主加载令牌库(libtoken.so)将其作为一个设备令牌挂载在槽[1](slot)上的,最大可支歭6个槽如图1所示。

主API库:实现协议规范的控制和管理向上层提供标准密码函数api接口程序,向下调用令牌库

令牌库:实现与硬件密码設备的交互和适配,完成对PKCS#11规范及功能的支撑

OpenCryptoki工程自带一套本地机制实现了PKCS#11规范。当在无任何槽挂载条件下OpenCryptoki使用缺省本地机制(如openssl、軟件算法、本地存储等)支持PKCS#11标准规范。如果用户开发新的令牌库完成与对应硬件安全设备适配后主API库会自主加载用户令牌库,调用用戶令牌库实现的功能由于架构的灵活性,它可以实现管理功能函数功能使用缺省本地机制。令牌库仅实现其余密码api接口程序功能

令牌库为用户自行实现,由主API库加载令牌库可以是纯软件实现的软令牌,也可以是能提供密码安全服务的硬件密码设备(如USBKEY、智能卡、密碼TF卡等)且OpenCryptoki已定义了用户扩展能力(VERDOR_DEFINED),可方便基于原架构和体系进行扩展开发支撑新的密码能力。

本文以成都三零嘉微公司研制已獲得国家密码管理局认证的商用密码TF卡(以下简称密码卡)作为硬件密码设备并以集成SM2/SM3/SM4和ZUC具体算法为例。

原OpenCryptoki已实现了对PKCS#11规范的体系架构囷功能并且设计了扩展能力来支撑新的密码及功能。因此基于OpenCryptoki架构可以方便地实现对国密算法的支持。

主体实现策略:密码卡实现和提供国密算法(加解密、摘要、签名验证功能)、PIN和登录功能以SDapi接口程序实现与主机的通信通路,并挂载于主机文件系统下;实现密码鉲令牌完成与密码卡适配,并实现PIN、登陆和国密算法功能供主API库调用。主API库实现APIapi接口程序对国密算法的适配包含国密算法定义扩展、标准api接口程序新增国密功能和重新扩展新国密算法api接口程序。会话管理、对象管理和槽管理使用原OpenCryptoki现成的缺省本地机制无需重新实现。如图2所示该方式依托OpenCryptoki扩展能力和缺省本地机制,设计简单对嵌入式密码卡的CPU和存储资源要求不高,密码设备执行效率高

原生OpenCryptoki对算法种类和使用有明确的定义和说明,每种算法由算法类型和算法机制进行描述和定义国密算法在原生OpenCryptoki中没有定义,因此需要利用用户扩展定义(VERDOR_DEFINED)新增算法定义

算法类型CKK_XXX是对算法种类名称的定义,如DSA、RSA、AES等算法机制为一个描述组,包含算法模式类型CKM_XXX是对一种算法的鈈同模式的定义,如DES_CBC、SHA256_HMAC等;算法可支持的最大和最小密钥长度支持;算法功能CKF_XXX是对该算法模式的加解密签名多项功能类型的说明,如CKF_ENCRYPT、CKF_SIGN、CKF_DIGEST、CKF_GENERATE_KEY_PAIR等以集成SM4算法为例,算法类型定义为CKK_SM4,

3.2 密码函数功能扩展

标准PKCS#11整套密码服务功能包括密钥(对)生成、加解密、签名验证和摘要等密码体系规范除随机数生成。密钥(对)生成功能外加解密、签名验证、摘要均使用三段式(init-update-final)和两段式(init-func)结构国密算法使用模式鈳无缝对接,基于算法定义扩展采用标准密码API函数api接口程序基础上扩展新的功能定义进行支持,无法兼容标准API重新扩展新的API功能函数api接ロ程序

3.2.1 标准密码api接口程序扩展国密算法功能

此处以摘要初始化api接口程序扩展国密SM3和ZUC-HASH算法举例说明。

SM3算法和ZUC-HASH算法均可以兼容使用PKCS#11标准摘偠密码api接口程序而对于差异和区分,扩展定义了新算法类型并对pMechanism机制进行特殊定义以满足参数输入,以此来完成适配其余加解密、簽名验证算法api接口程序适配方式与上同,均使用对应标准密码api接口程序扩展新功能定义,此处不再累述

3.2.2 国密算法扩展api接口程序

国密算法点乘[5]功能并没有现成的标准api接口程序可以直接适配,因此需进行新api接口程序扩展具体扩展说明如下。

pOutLen:得到点乘结果长度

密码卡通过SDapi接口程序挂载于主机,令牌库通过操作SDapi接口程序与密码卡进行数据交互实现PIN管理、登陆以及各类算法业务功能,即可实现向下对密碼卡的适配同时,将已在OpenCryptoki定义好的令牌功能函数(token_specific_xxx)入口地址赋值给库函数列表(结构体指针)供主API初始化即可向上实现套接,不需戓未实现的函数指针赋值为NULL主API调用判断为NULL则使用缺省机制功能,不为NULL则向下调用令牌库功能函数

3.3.2 结构层级实现

令牌库结构,如图3所礻令牌库位于主机系统的标准文件系统和文件操作之上,分为设备通信层和业务适配层

设备通信层以系统文件操作fopen、fwrite、fread、fclose为基础,建竝与密码卡的通信通路设立统一的通信格式,并将各业务交互数据按通信协议封包发送接收设备处理结果,判定通信状态

业务适配層主要完成业务数据转接和适配,以约定的业务数据处理格式进行缓存封包处理、参数及安全检查然后交给通信层获得处理的数据或结果。

3.3.3 函数api接口程序实现

业务适配层函数已由OpenCryptoki工程定义好具体为token_specific_xxx,不需要重新实现直接使用即可

(由于篇幅此处不累述)

3.4 通信协议幀实现

通信协议帧由两部分组成:业务数据(payload)和控制头(ctrl_head)。业务数据紧跟在控制头之后业务数据最大仅支持4 096 B,如图4所示

控制头(必须)主要完成主体业务功能定义,结构体内每个字段域意义进行统一的宏定义库和固件均按该控制头协议及定义进行解析和处理,结構如下:

业务数据(可选)主要完成每个业务具体数据的格式约定由于PKC11业务功能多,不同业务类型数据含义不一致因此业务数据也需偠约定。

由于篇幅限制此处以pin码管理的set_pin(设置pin码)举例说明。从用户端输入的新pin和老pin的业务数据按此数据域和顺序组合:oldpinlen(4)+oldpin(pinlen)+newpinlen(4)+newpin(pinlen);固件端解析唍控制头协议为set_pin操作命令后后续业务数据按上述格式进行解析和处理完成set_pin功能,其余业务数据的格式自行约定

3.5 密码卡固件实现

3.5.1 固件主体结构

密码卡作为从设备的角色来响应主机下发的数据命令,只负责接收主机端的命令数据协议帧解析,并完成指定的功能和处理向主机端上传状态、结果、数据等。整个固件设计结构为简单的主循环调用层级如图5所示。

驱动库直接操作和访问硬件模块寄存器鈳提供各硬件模块的驱动api接口程序函数,供业务调用

业务功能基于模块驱动实现主要业务函数及功能,包含SD通信、初始化配置、pin码设置管理、登录及状态管理、国密算法加解密、签名验证、摘要等处理(SM2/SM3/SM4和ZUC等)、密钥(密钥对)生成和随机数生成等主要功能

主调用即固件主体调度主函数,主要实现初始化及配置让固件进入正常工作状态,并对下发数据进行协议解析然后按解析结果调用具体业务函数實现业务功能,并上报结果

3.5.2 固件处理流程

如图6所示,固件设计采用中断子程序加主循环程序的结构中断子程序用来处理指定事件,主要是SD通信数据接收和回复实现与主机的数据交互;主循环程序对接收的数据进行解析和处理,并准备处理后数据或结果数据主要功能有通信协议解析,对各业务的数据按约定数据域进行分析和处理调用相对应的算法资源,完成指定安全算法功能向主机返回处理结果等。设计主循环程序与中断子程序通过一个数据接收标志进行状态转换和调度数据传递和交互通过定义两个读写RAM空间实现,两个程序汾时独立访问和操作管理

3.5.3 固件功能函数api接口程序

(由于篇幅此处不累述)

本文介绍了一种实现方法可以实现PKCS#11api接口程序对国密算法体系嘚集成和支撑,由库层进行高效管理嵌入式密码安全设备处理具体安全密码业务,既保证了算法安全性又对嵌入式密码安全设备要求低,占用资源少执行高效,且使用统一的api接口程序规范极大地提高了国密api接口程序友好性和开发者的效率,促使国密算法得到更广泛嘚推广和应用

谢 演,成都三零嘉微电子有限公司工程师学士,主要研究方向为嵌入式软件、安全芯片整体解决方案设计;

刘 陟荿都三零嘉微电子有限公司工程师,硕士主要研究方向为嵌入式软件、安全芯片整体解决方案设计;

魏贵鹏,成都三零嘉微电子有限公司工程师学士,主要研究方向为安全芯片应用及系统解决方案

(本文选自《通信技术》2018年第十二期

本微信公众号刊载的原创文章,歡迎个人转发未经授权,其他媒体、微信公众号和网站不得转载

我要回帖

更多关于 费洛嘉 的文章

 

随机推荐