0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过对驱动层硬件插拔的研究实现USB安全的设计

电子设计 来源:郭婷 作者:电子设计 2019-06-05 08:14 次阅读

大多数普通安全U盘通过使用软件实现安全U盘加密功能。在使用过程中,用户需要打开专用的U盘浏览器或管理工具等,不但操作不方便,而且不符合USB设备使用习惯和人性化设计。

本文通过对驱动层硬件插拔(PNP)的研究,PNP是由Microsoft提出的,英文Plug and play的缩写,中译即插即用,意思是系统自动侦测周边设备和板卡并自动安装设备驱动程序,作到插上就能用,无须人工干预,是Windows自带的一项技术。所谓即插即用是指将符合PNP标准的PC插卡等外围设备安装到电脑时,操作系统自动设定系统结构的技术。这就是说,当用户安装新的硬件时,不必再设置任何跳线器开关,也不必用软件配置中断请求(IRQ)、内存地址或直接存储器存取(DMA)通道,Windows会向应用程序通知硬件设备的新变化,并会自动协调IRQ、内存地址和DMA通道之间的冲突。

在分析了Windows DDK/FSD驱动开发技术、卷上过滤驱动技术,提出了在Windows系统插入USB设备时,自动挂载符合规定卷格式的USB设备,映射为本地磁盘,USB(Universal Serial Bus)即“通用串行总线”是一种应用在计算机领域的新型接口技术。USB的拓扑结构中居于核心地位的是Host(也称为主机)。任何一次USB的数据传输都必须由主机来发起和控制,所有的USB外设都只能和主机建立连接,任何两个外设之间或是两个主机之间无法直接通信。而目前,大量的扮演主机角色的是个人电脑PC。随着USB应用领域的逐渐扩大,对于USB的期望也越来越高。我们希望USB能应用在各种计算机领域中,希望能通过PDA等移动设备直接和USB外设通信,使得USB能应用在没有PC的领域中。

1 原理与架构

系统分为驱动层和应用层,驱动层包括一个卷过滤驱动程序和一个文件系统过滤驱动;应用层包括一个应用程序和与驱动交互的dll。应用层是隐藏界面的应用程序。卷过滤驱动对USB盘的(PNP)动作识别,读移动硬盘卷的头为512 B,对特定标识识别,如果不符合卷标示,则可采用禁用或放行等;如果符合卷格式和标识,则对此卷进行映射。

普通U盘使用前需要格式化,物理U盘上的数据是随机的数值。密码算法采用基于口令的密码系统 (RFC2898),口令和盐(salt)结合产生密钥。盐可看作是对口令导出的一个大密钥集合的索引。盐和迭代次数构成了PKCS#5v1.5中基于口令加密基础。系统总体架构序列图如图1所示。

通过对驱动层硬件插拔的研究实现USB安全的设计

加密算法可采用AES-256、Serpent、Twofish等,解密时通过判断厂商标识以及CRC-32校验和是否正确,在此过程中在权限注册区读入相应的注册信息,如GUID和厂商标识等。如上述过程正确,则执行正确的卷映射过程。

2 研究与实现

系统应用层主要由三个线程组成,主线程是应用程序,剩下卷映射线程和卸下卷(unmount)线程分别用来在USB存储设备做PNP时对本地盘进行卷映射和卸下卷。线程和驱动层采用事件通信机制。本系统定位于移动存储设备,包括移动硬盘、U盘及移动存储卡等移动存储介质。密文区是从内部可信计算机拷贝数据到USB存储设备,数据在后台加密处理后存放的区域;权限注册区则写入GUID和必要的厂商、运行权限、内外网策略等。

卷映射线程收到底层USB的PNP动作时,首先得到运行环境,根据运行环境得到USB存储设备读写权限,然后根据相关密码、密钥等参数通过DEVICEIOCONTROL通知驱动创建本地虚拟盘,最后广播DBT_DEVICEARRIVAL消息通知操作系统。

集中注册与授权,使用前必须经过授权中心统一注册与授权,包括格式化、实名注册、标识密级、指定授权计算机、是否采用口令保护等。授权后的移动存储介质在涉密计算机上能正常使用,当未授权的移动存储设备接入计算机时,系统可自动关闭USB端口,使未授权移动存储介质无法在涉密计算机上使用。

对于正确安装了移动存储安全系统客户端的计算机,客户端自动上报该机状态,完成到控制台服务器注册功能,有效防止非法用户安装客户端程序。灵活的注册策略,可设定移动存储介质允许的计算机或组;管理员可随时更改移动存储介质注册策略和信息,包括远程策略变更、挂失和注销等;外出拷贝功能是将COPY到U盘内安全存储的数据与外界没有安装客户端程序的计算机进行数据交互使用。

应用层完成对移动存储设备的格式化工作。对卷起始位置写入密码、校验和等信息,提供了FAT32和NTFS两种文件系统格式。在驱动中对移动存储设备做卷映射,创建类型为FILE_DEVICE_DISK卷过滤驱动,使用不同的盘符。在IRP_MJ_WRITE和IRP_MJ_READ请求例程中进行加解密。在IRP_MJ_WRITE分发例程中把相关的IRP存入队列。在新创建的系统线程内进行卷加密。在IRP_MJ_READ中进行解密。

注册主要由应用层注册工具完成,可由用户选择FAT32或NTFS格式。注册流程如下:访问移动存储盘,输入需要注册信息。注册信息包括:移动存储盘密码、标签名、安全等级、客户标识名、分区个数、内网移动存储策略、外网移动存储策略、1~5等级的移动存储策略。

插入安全U盘后,得到处理环境信息:是否为有效设备、是否有客户端代理、客户标识匹配、在内网否、安全等级是否1~5,然后决定应用不同策略。驱动只要挂载存储卷的UpperFilter即可完成卷的加解密任务。

在PnP技术出现之前,中断和I/O端口的分配是由人手工进行的,您想要这块声卡占用中断5,就找一个小跳线在卡上标着中断5的针脚上一插。这样的操作需要用户了解中断和I/O端口的知识,并且能够自己分配中断地址而不发生冲突,对普通用户提出这样的要求是不切实际的。PnP技术就是用来解决这个问题的,PnP技术将自动找到一个不冲突的中断和I/O地址分配给外部设备,而完全不需要人工干预。但是如果您读懂了上面关于中断冲突的那一部分,您就应该了解,在中断资源非常紧张的今天,即使是PnP技术,也不一定能找到一个合适的中断分配给您刚刚插入的设备,所以尽量释放那些没有必要的中断,对PnP正常工作也是很有帮助的。

卷过滤驱动在IRP_MJ_PNP请求时监控设备的插拔消息,程序判断是否是指定的卷格式,如发现是移动存储设备,则用DeviceIoControl与驱动层通信。通过对新加卷的监控,实现对移动存储设备的加解密。应用层通过DeviceIoControl与应用层的通信获得用户密钥和权限策略。

在文件系统驱动层映射卷的流程如下:应用程序调用ZwCreateFile或IoCreateFileSpecifyDeviceObjectHint,I/O管理器确定请求的目标是哪个逻辑卷,检查是否设置了VPB_MOUNTED。如此卷在系统引导后未被卷映射,则I/O管理器发送卷映射请求(IRP_MN_MOUNT_VOLUME)。

对移动存储设备的格式化可分为FAT32和NTFS两种格式。卷过滤驱动监控系统的PNP行为,如移动介质头512 B符合卷头格式,则使用事件通知应用层对移动介质卷映射,卷映射线程将相关参数(盘符、密码、磁盘属性)等传递到文件系统驱动,创建一个FILE_DEVICE_DISK类型的过滤设备;然后创建一个线程,在线程中应用ZwCreateFile打开卷设备Handle,读取卷头信息,对卷头信息进行验证,如验证卷头信息成功,则创建相应盘符的符号链接;对USB设备加密模式为XTS;卸下卷线程接到拔下USB存储器通知事件后,对相应盘符进行卸载,清理相关资源。

应用层包括对卷格式化功能,对移动USB设备合法性验证、得到USB运行环境信息、根据策略信息对USB设备进行读写、禁用等控制。在USB设备上单开辟一个区域,用来存取注册信息以及写入注册信息和读取注册信息,生成GUID写入USB设备的唯一标示,完成卷映射功能。

安全U盘总体设计序列图如图2所示。

通过对驱动层硬件插拔的研究实现USB安全的设计

在PNP发生时,驱动层和应用层通过事件进行通信。对卷映射和卸下卷过程各启动一个线程等待PNP事件发生。首先验证卷头格式,卷头信息读到RAM中。卷头64 B是生成密钥所需的盐(salt),驱动层解密读入的标准卷头、解密过程中的所有数据保存在RAM中。在此过程中需要得到如下参数:

卷头导出函数用的PRF参数(见PKCS #5 v2.0)可为:HMAC-SHA-512、HMAC_RIPEMD-160等;厂商标示密码和读入的盐值传给卷头密钥导出函数,生成头解密密钥和扇区解密密钥;使用的加密算法为AES-256;解密时对照厂商标示密码及校验和,密钥用来解密卷上的扇区。

主要数据结构和参数如下:

(1)卷映射数据结构

typedef struct

{

Int nReturnCode; //底层sys返回码

Short wszHsVolume[MAX_PATH]; //卷名称

Password VolumePassword; //用户密码

BOOL bCache;//是否在驱动中缓存密码

Int nDosDriveNo; //需要卷映射的盘符号

Int BytesPerSector; //扇区字节数

BOOL bSystemVolume; //是否为系统卷

BOOL bPersistenVolume; //是否为隐藏卷

BOOL bMountReadOnly;//是否映射为隐藏卷格式

BOOL bMountRemovable;//是否映射为可移动

//存储设备

} MOUNT_STRUCT;

(2)设备信息结构

typedef struct _SECDEVICEINFO

{

CHAR szProvider[SD_MAX_PROVIDER_LEN];

//设备提供者名称

DWORD dwDeviceType; //设备类型

CHAR szDeviceID[SD_MAX_DEVICE_ID_LEN];

//设备唯一标识

__int64 dwDeviceCapacity; //设备容量

} SECDEVICEINFO, *PSECDEVICEINFO;

(3)策略数据结构

typedef struct _POLICYDATA

{

BOOL bEnableSecPart; //是否启动保密区

BOOL bReadSecPart; //是否可读保密区

BOOL bWriteSecPart; //是否可写保密区

BOOL bEncryptSecPart; //是否加密保密区

BOOL bEnableExchPart; //是否启用交换区

BOOL bReadExchPart; //是否可读交换区

BOOL bWriteExchPart; //是否可写交换区

BOOL bEncryptExchPart; //是否加密交换区

BOOL bExchPartToSecPart;

//是否允许从交换区复制到保密区

BOOL bsechPartToSecPart;

//是否允许从保密区复制到交换机

} POLICYDATA,*PPOLICYDATA;

应用层创建双线程,等待PNP消息,如接入USB盘符和特定卷格式,则对卷做相应卷映射和卸下卷。

对卷卷映射函数:

Int MountVolume (

int driveNo,

char *volumePath,

Password *password,

MountOptions *mountOptions,

BOOL bReportWrongPassword );

对卷卸下卷函数:

BOOL UnmountVolume

(int nDosDriveNo, BOOL forceUnmount );

创建内存中卷格式:

int VolumeWriteHeader(char*header,int ea,int mode,Password* password,

char*masterKey,

PCRYPTO_INFO*retInfo,

BOOL bWipeMode );

读入USB卷头:

int VolumeReadHeader(char*encryptedHeader,Password);

经过测试人员测试和客户现场应用,本系统达到了良好的应用效果,从驱动层到应用层都运行良好。系统支持FAT32和NTFS格式,对容量较大的USB移动存储设备和容量较小的U盘都有较好的使用和保密果。WINDOWS NT则更进一步,它可以检测出SCSI设备及其他一些硬件,到了WINDOWS95/98,则几乎可以实现全自动的安装和系统的动态重配置。尽管WINDOWS95不可能对所有旧设备都能正确地识别,甚至有时也会求助于用户,但就即插即用本身而言,这已经是一个真正的飞跃了。现在的WIDNOWS98/2000在PNP方面又得到进一步的发展。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    59

    文章

    7378

    浏览量

    257490
  • WINDOWS
    +关注

    关注

    3

    文章

    3419

    浏览量

    87088
  • 电脑
    +关注

    关注

    15

    文章

    1598

    浏览量

    67188
收藏 人收藏

    评论

    相关推荐

    基于USB数据采集系统的研究与设计--ResearchandDesignofDataAequisitio

    传统总线不足之处,在此基础上研究了基于USB的数据采集系统,根据系统应该达到的技术指标,从而确定系统的整体框架和各个部分芯片的选择。整个系统包括硬件设计和软件设计两部分,实现数据高速转
    发表于 06-10 00:57

    通过USBN9603/P89C51平台实现USB接口硬件加密

    要的实现。WDM支持USBl.l协议,并为用户开发自己的用户驱动程序提供USB驱动程序接口USBDI。USB用户
    发表于 09-19 09:26

    USB驱动程序的3个函数接口

    实现USB设备的驱动程序。OEM负责给基于WinCE的平台提供HCD模块,这样相应的硬件才能与USBD模块进行交互。图1说明了与主机的USB
    发表于 05-27 05:00

    如何通过硬件实现安全CAN通信网络的方式

    汽车在往智能化方向发展,节点间通信的安全性变得越来越重要。当下是在报文中添加验证信息实现通信安全,这样不仅浪费宝贵的通信资源,还增加软件复杂度。本文将介绍一种通过硬件
    发表于 02-26 06:06

    怎么通知应用cp2102芯片的热插拔状态?

    在用iMX6UL开发板,U盘可以从内核层面实现插拔。我现在有个USB转串口的设备(cp2102芯片),不知道有没有朋友知道怎么通知应用该设备的热
    发表于 01-11 06:31

    USB转串口热插拔无法实现是为什么?

    在用iMX6UL开发板,U盘可以从内核层面实现插拔。我现在有个USB转串口的设备(cp2102芯片),不知道有没有朋友知道怎么通知应用该设备的热
    发表于 01-11 07:40

    API设备驱动管理与外设驱动适配标准接口设计实现

    1、API 设备驱动管理与外设驱动适配标准接口实现bl_mcu_sdk 代码层次结构主要分为以下几层应用
    发表于 07-14 17:41

    重复插拔USB有时候会导致USB驱动崩溃要怎么处理?

    ://github.com/leeebo/esp32s2_usb仅保留USB MSC以及VFS部分,以实现类似U盘的功能,测试中发现重复插拔USB
    发表于 02-21 06:20

    安全删除USB设备的软件

    USB Safely Remove是一款支持热插拔装置和迅速切断一个公用的热插拔装置的软件,USB Safely Remove是一个可以将USB
    发表于 04-23 09:31 15次下载
    <b class='flag-5'>安全</b>删除<b class='flag-5'>USB</b>设备的软件

    嵌入式Linux下可插拔输入驱动机制研究

    本文介绍了嵌入式linux下的输入驱动接口,详细分析了输入驱动中如何实现插拔机制,描述了USB人机接口设备和可
    发表于 07-27 15:38 16次下载

    PCIe总线的热插拔机制

    当然,热插拔不仅仅是硬件的事,其需要软硬件协同实现。要想实现插拔功能,操作系统、主板热
    的头像 发表于 09-06 09:20 2w次阅读

    一触式插拔的圆形连接器:通过推挽机构,实现了易插拔

    浩亭日本(总部横滨市)上市了可一触式插拔的圆形连接器“M12 PushPull”。以牢固性为特点的M12圆形连接器通过推挽机构,实现了易插拔性。
    发表于 10-19 16:53 2077次阅读

    Linux下的硬件驱动USB设备(下)

    赵明, 联想软件设计中心嵌入式研发处系统设计工程师USB骨架程序(usb-skeleton),是USB驱动程序的基础,通过
    发表于 04-02 14:37 310次阅读

    如何使用51单片机控制SL811HS实现USB主机的硬件设计和底层驱动的编写

    本文介绍了51单片机控制SL811HS实现USB主机的硬件设计和底层驱动的编写。其中,底层驱动部分主要讲述了
    发表于 12-20 17:27 2次下载
    如何使用51单片机控制SL811HS<b class='flag-5'>实现</b><b class='flag-5'>USB</b>主机的<b class='flag-5'>硬件</b>设计和底层<b class='flag-5'>驱动</b>的编写

    虹科分享 | 集中管理的安全USB驱动器的好处

    为了确保你的组织的数据安全,为使用者提供安全USB驱动器是一个很好的开始。一个中央管理解决方案将确保消除所有丢失数据的风险,同时为你提供强大的生产力工具。执行摘要一个
    的头像 发表于 09-29 11:42 269次阅读
    虹科分享 | 集中管理的<b class='flag-5'>安全</b><b class='flag-5'>USB</b><b class='flag-5'>驱动</b>器的好处