SKF密码设备研究
SKF介绍
SKF接口是国密标准中智能密码钥匙的C语言应用开发接口标准,目前很多国内密码密码设备厂商都为其产品提供了SKF接口的开发包。开发者可以通过统一的SKF接口开发密码应用,访问来自不同设备供应商的USB-Key、TF卡、智能卡等不同形态的密码设备,而无需和某一个设备供应商的专属设备或专属接口绑定。
GmSSL与SKF
GmSSL项目从2.0版本开始,以Engine的方式增加了对SKF设备的完善支持。GmSSL通过在libcrypto密码库中引入SKF框架,实现了对不同厂商SKF设备的支持。通过将SKF接口封装为SKF Engine,使得上层应用和SSL库可以直接通过EVP接口动态调用不同SKF设备。GmSSL项目还修改了gmssl命令行工具中所有相关功能,使得enc、dgst、pkeyutl、sm2utl等命令都可以支持SKF引擎,gmssl命令行工具还新增加了skf命令提供SKF设备的管理功能。应用开发者在通过命令行工具完成对SKF设备的初始化之后,可以直接通过SKF引擎为现有的密码应用提供SKF设备的支持,只需要提供一个SKF引擎的配置文件,而几乎无需进行任何代码开发,可以大大节省密码设备开发的工作量。
设备逻辑
GmSSL通过ENGINE机制支持密码硬件。鉴于《智能IC卡及智能密码钥匙密码应用接口规范》标准中公布了访问国密硬件的C语言API (下面简称SKF API),GmSSL通过ENGINE机制访问支持国密SKF API的国产密码硬件。
一个SKF API设备中可以包含一个或多个应用(Application),每个应用可以包含一个获多个容器(Container),每个容器中可以存放两对分别用于加密和签名的密钥对,以及两个相应的证书或证书链。每一个容器只能为ECC或RSA一种类型,一个容器中不能混用ECC密钥和RSA密钥。因此,在SKF API中提供公钥密码计算的接口通过Container Handle来引用公钥,容器的特性使得应用无需区分签名密钥和加密密钥,SKF API的实现会自动从容器中选择对应类型的密钥。
在使用公钥及访问容器时,应用需要进行两级认证,第一级为设备认证,第二级应用认证。设备认证需要全设备唯一的设备认证密钥,设备认证密钥是固定长度的对称密钥。访问某个具体的应用需要提供该应用的专有口令进行认证,认证的口令是可变长度的口令字符串。
管理工具
开发者在获得密码设备后,首先需要对密码设备进行初始化,如设置密码、生成密钥容器、导入密钥和证书等。
通过gmssl命令行工具的skf命令可以访问和管理SKF设备,通过gmssl的pkey、pkeyutl和req等命令及SKF引擎可以密码计算、公钥导出、证书生成等功能,本节主要介绍skf命令的功能和用法。SKF接口包含设备管理、应用管理、密钥容器管理、数据对象管理等功能,skf命令封装了SKF接口的上述功能,可以完成枚举设备、创建应用和密钥容器,创建签名私钥、导入解密私钥、导入证书等功能。可以通过-help打印skf命令的所有选项。

设备管理
设备管理包括枚举设备、打印设备信息、设置设备标签、修改设备认证密钥和发送测试报文等功能。
应用管理
应用管理包含创建应用、枚举应用、删除应用。
密钥容器管理
SKF设备中以密钥容器的方式管理私钥,一个应用中可以建立多个密钥容器,每个密钥容器中可以装载同类型的2对公私钥对,其中一个为签名密钥对,一个为加解密或密钥交换密钥对。签名密钥对只能在SKF设备内部生成而无法由外部导入,而加解密或密钥交换密钥只能从外部导入而无法在设备内部生成。在完成密钥生成或导入后,密钥对中只有公钥可以导出,私钥是无法导出的。密钥容器还支持证书的存储,一个密钥容器中可以存储两个证书或两条证书链,分别对应两个密钥对。通过skf命令可以完成密钥容器的枚举、创建和删除。
数据对象管理
SKF应用支持存储若干数据对象,由于应用是受到PIN保护的,因此用户程序可以将需要保护的用户数据、配置文件等安全敏感数据以数据对象的方式保存到SKF设备中。但是由于SKF设备的内部存储空间较小,通常只有几十KB到数百KB,因此只能存储较少数据。通过skf命令可以实现数据对象的枚举、导入、导出和删除。
使用GmSSL生成SM2证书
实验环境:Ubuntu1804
- 生成SM2密钥对"cakeyGM.pem"

- 生成SM2自签证书作为根CA“cacertGM.crt”:
gmssl req -new -x509 -key private/cakeyGM.pem -out cacertGM.crt
- 生成SM2密钥对"ly.com.pem",进入上级目录,执行
gmssl sm2 -genkey -out ly.com.key
- 生成证书请求CSR:
gmssl req -new -key ly.com.key -out ly.com.csr
- 用CA进行签名:
sudo gmssl ca -in ly.com.csr -out ly.com.crt -cert demoCA/cacertGM.crt -keyfile demoCA/private/cakeyGM.pem
- 验签:
gmssl verify -verbose -x509_strict -CAfile demoCA/cacertGM.crt ly.com.crt
- 生成PKCS12格式的证书文件,在
demoCA目录下执行sudo gmssl pkcs12 -export -in cacertGM.crt -inkey private/cakeyGM.pem -out lyRootCA.p12
导入证书
环境:WIN10
KEY型号:mToken-GM3000
- 插入KEY,打开管理工具,认证设备

- 登录应用

- 创建容器

- 导入证书

- 证书

- 重新拔插,安装证书(或者打开管理员工具,进行证书认证)

参考资料
SKF密码设备研究的更多相关文章
- 802.1X 账号密码+设备信息双重认证
名词解释 802.1X: IEEE802 LAN/WAN 委员会为解决无线局域网网络安全问题,提出了 802.1X 协议.后来,802.1X协议作为局域网端口的一个普通接入控制机制在以太网中被广泛应用 ...
- EBS密码加密研究
DECLARE v_password_1 VARCHAR2(240); v_password_2 VARCHAR2(240); v_password_3 VARCHAR2(240); ...
- Android逆向之旅---Android中锁屏密码算法解析以及破解方案
一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机 ...
- 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz
原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...
- [转]设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识
原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...
- 有关WINDOWS XP登录密码的几种方法
网上关于破解WINDOWS XP登录密码的几种方法很多,但许多根本不行.我现在总结自己试过几种,这几种方法其实均比较菜的,但可行的.WINDOWS XP登录是由SAM 文件管理的,总体来说“山姆大叔” ...
- android黑科技系列——修改锁屏密码和恶意锁机样本原理分析
一.Android中加密算法 上一篇文章已经介绍了Android中系统锁屏密码算法原理,这里在来总结说一下: 第一种:输入密码算法 将输入的明文密码+设备的salt值,然后操作MD5和SHA1之后在转 ...
- HUAWEI网络设备恢复Console口密码
密码遗忘 本章介绍了Console口丢失的处理方法,建议用户妥善保管密码,并定期修改. 恢复Console口密码 设备提供如下方法恢复Console口密码.•方法一:通过STelnet/Telnet登 ...
- 大量无线键盘存在KeySniffer漏洞-可嗅探用户输入的内容
几美元的一根天线.一个无线发射器,还有几行Python代码,有了这些,黑客就可以在几十米开外主动地记录下你的用户名.密码.信用卡.你写的稿子,总之就是你用无线键盘输入的任何东西. 黑客所利用的是一种无 ...
随机推荐
- springBoot获取@NotBlank,@NotNull注解的message信息
概述 springBoot后台验证接收的参数是否不合法时,会抛出一个BlndException异常,获取message的自定义信息并返回 验证 UserEntity类 @Data @Entity @T ...
- vue要求更新3.0-》使用axios的时候出现错误
要求更新 使用axios报错 - Running completion hooks...error: 'options' is defined but never used (no-unused-va ...
- php-fpm解读-进程管理的三种模式
php-fpm进程管理一共有三种模式:ondemand.static.dynamic,我们可以在同一个fpm的master配置三种模式,看下图1.php-fpm的工作模式和nginx类似,都是一个ma ...
- 学Haskell不该误入范畴论
浪费了两个星期去学范畴论,结果没啥用,关键是太抽象了.理解不能. 实际上压根联系也没那么紧密.
- Node.js返回JSON
在使用JQuery的Ajax从服务器请求数据或者向服务器发送数据时常常会遇到跨域无法请求的错误,常用的解决办法就是在Ajax中使用JSONP.基于安全性考虑,浏览器会存在同源策略,然而<scri ...
- [转]C++ 堆栈溢出的原因以及可行的解决方法
栈溢出(stackoverflow)的原因及解决办法 大家都知道,Windows程序的内存机制大概是这样的:全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出: 函数地 ...
- vue开发环境配置
一.开发工具 Visual Studio Code 二.环境搭建 vue推荐开发环境: Node.js: javascript运行环境(runtime),不同系统直接运行各种编程语言 npm: Nod ...
- 【LINQ】Select与SelectMany的区别
Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值.Select() 为每个源值生成一个结果值.因此,总体结果是一个与源集合具有相同元素数目的集合.与之相反,Sel ...
- MySQL事务优化
====================事务特性 事务隔离级别 事务控制语句 MySQL优化==================== 事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全 ...
- Linux shell awk中print及变量使用
Linux处理文本工具 grep: 过滤文本内容 sed: 编辑文本内容 awk: 显示文本 awk: Aho Peter Weinberger Kerni ...