USB-KEY原理简要说明

本文介绍USBKey的身份认证原理及其加密技术特点,包括采用的冲击响应认证方法、HMAC-MD5算法等,并详细阐述了USBKey的兼容性、速度及使用便捷性优势。
一、        usbkey实现身份认证原理

采用冲击响应的认证方法,登录时在服务器端和客户端同时进行计算,客户端计算前要先验证USER PIN,通过后在硬件中使用HMAC-MD5密钥进行计算,服务器端在服务器上使用软件进行计算,比较计算结果。

二、        usbkey的优点

1、兼容性好

usbkey不仅对打印机、扫描仪等设备具有高度的透明性,特别是多个相同的usbkey也可以使用USB HUB并联在一起使用,相互之间不会干扰。

2、速度快

对于使用usbkey加密后的软件,其运行速度同加密前区别不大,usbkey能够在很短的时间内处理完毕,保证用户程序的顺畅运行。

3、使用简便

usbkey在API函数调用上从用户角度出发,最大限度简化使用接口。用户能够在很短的时间内掌握usbkey的使用方法,节约开发上所投入的时间。

三、        高加密强度和身份认证相结合

      usbkey是全新设计的高强度usbkey,有完整的用户管理。

    (1)用户必须在超级用户状态下(SO PIN验证通过),通过自己设定的不超过51字节的种子生成PID,以后打开和关闭usbkey都需要通过PID来完成。PID的生成算法是在usbkey内部完成的,而且是不可逆的,也就是说,只有生成者才知道什么样的种子能生成什么样的PID,别的人即使知道PID,同时也能够调用这个计算过程,但因为不知道种子是什么,是无法生成和您相同的PID的硬件,保证了用户的usbkey的独特性。

    (2)用户在对usbkey中的数据进行读写操作时需要进行USER PIN验证,又增加了一层对软件的保护性。

    (3)用户可以在配置设备时设为只读,那么usbkey中的数据只可以读取,而不能被更改,密钥也不能被修改,从而保证了锁内数据不被篡改。

    (4)使用usbkey硬件中的HMAC-MD5算法进行冲击响应身份认证。HMAC-MD5密钥存在usbkey中,该密钥只用于计算,任何人获取不到密钥的内容,保证密钥的安全性。

    (5)提供了安全方便的外壳加密工具,使加密工作非常简单。

四、        系统支持

    usbkey采用无驱设计,使用方便,兼容性好,支持多种操作系统台:Windows98(第二版)、Windows2000、WindowsXP、Windows2003等。

五、使用usbkey进行身份认证

     可以应用usbkey进行冲击响应身份认证,替换掉传统的用户名和密码方式,使登录更加安全。其原理如下图所示:

 

    在整个认证过程中,采用冲击响应的认证方式。当需要在网络上验证用户身份时,先由客户端向服务器发出一个验证请求。服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为冲击)。客户端将收到的随机数提供给,由使用该随机数与存储在中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。

六、常见问题

1. 什么是USB接口,它有何优点?

     答:USB接口的含义是通用串行总线,英文全称是Universal Serial Bus。是一种新的接口标准。可详见www.usb.org。优点是即插即用、支持热插拔、传输速度快、可通过扩展连接多达127个USB设备,不用担心USBusbkey与打印机等外设的冲突。

2.为什么我的USBusbkey插上后显示未知设备?

     答:一般有3种情况。(1)有干扰或是接触不良,重新插入或者更换计算机上的其它USB插口。(2)usbkey采用无驱设计,在win98二版以上的操作系统使用系统自带的驱动,不需要独立安装驱动。但在不完善的操作系统安装过程中会去掉系统驱动,用户需要在同版本的操作系统种将WINDOWS\Driver Cache\i386\driver.cab文件拷贝到不完善的操作系统的相应目录中。(3)请检查是否关闭了BIOS中的USB支持选项。

3.硬件安装问题?

     答:win98二版安装时需要win98的系统安装盘上的base6.cab包。win2000/XP/2003不需要系统安装盘。如果在计算机上不能认到usbkey,请使用USB鼠标或者USB键盘来检测计算机的系统是否支持标准HID设备。

4.usbkey的PID是否安全?

     答:非常安全。它是由一个长度不超过51个字节的字符串作为种子,usbkey会根据这个种子生成 PID。这个生成算法是在usbkey内部完成的,而且是不可逆的,也就是说,只有生成者才知道什么样的种子能生成什么样的PID,别的人即使知道PID,也能够调用这个计算过程,但因为不知道种子是什么,是无法生成您的PID的,从而无法生产出一个与您手中一致的usbkey硬件。


原文地址:http://jeanscheng.blog.163.com/blog/static/11253401120097594012790/

/******************************************************************************* * Copyright (c) 2013, SHENZHEN SEMITEK Co.,LTD. * All rights reserved. * * ÎļþÃû³Æ: key_io.c * * ¹¦ÄÜ˵Ã÷: Ö÷º¯Êý´¦Àí³ÌÐò * ÐÞ¸Ä˵Ã÷: ******************************b*************************************************/ #include "om_driver.h" #include "main.h" #include "mouse.h" #include "main_24g.h" #include "usb_cfg_info.h" #include "flash_process.h" //-----------------------------------------------------------------------------; // ³£Á¿¶¨ÒåÇø // ¶¨ÒåÖ»Óк¯ÊýÄÚ²¿Ê¹Óõij£Á¿ // #define bkey_dpi (1<<7) #define bkey_5 (1<<4) #define bkey_4 (1<<3) #define bkey_m (1<<2) #define bkey_r (1<<1) #define bkey_l (1<<0) //-----------------------------------------------------------------------------; // ±äÁ¿¶¨ÒåÇø // bool bconn_key_press; bool bmode_swtich_press; bool bmode_swtich_valid; uint8_t key_status; uint8_t key_status_bak; uint8_t key_data; extern bool bble_conn_en; //----------------------------------------------------------------------------; // ±í¸ñ¶¨ÒåÇø // /****************************************************************************** * º¯ÊýÃû³Æ: key_io_scan() * ¹¦ÄÜÃèÊö: »ñÈ¡°´¼ü״̬ * ÊäÈë²ÎÊý: ÎÞ * Êä³ö²ÎÊý: ÎÞ * ˵ Ã÷: ÎÞ ******************************************************************************/ void key_io_scan(void) { key_status = 0; if(0 == KEY_MODE_R0) key_status |= bkey_l; if(0 == KEY_MODE_R1) key_status |= bkey_r; if(0 == KEY_MODE_R2) key_status |= bkey_m; if(0 == KEY_MODE_R3) key_status |= bkey_back; if(0 == KEY_MODE_R4) key_status |= bkey_pre; if(0 == KEY_MODE_R7) key_status |= bkey_dpi; } /****************************************************************************** * º¯ÊýÃû³Æ: key_process() * ¹¦ÄÜÃèÊö: * ÊäÈë²ÎÊý: * Êä³ö²ÎÊý: * ˵ Ã÷: ******************************************************************************/ void key_process(void) { static uint32_t conn_key_time_count, mode_swtich_time_count; key_io_scan(); if(key_status_bak != key_status) return; if(key_status != key_data) { key_data = key_status; } if(iDEVICE_TYPE_USB == device_type) return; if(0x07 == key_status) { if(0==(sys_ctrl&bmcu_reset)) { if(false == bmode_swtich_press) { bmode_swtich_press = true; mode_swtich_time_count = drv_rtc_read(OM_RTC); } else { if(mMS_TO_TICK(1000) > (drv_rtc_read(OM_RTC)-mode_swtich_time_count)) { if(mMS_TO_TICK(800) < (drv_rtc_read(OM_RTC)-mode_swtich_time_count)) key_data = 0; return; } if(iDEVICE_TYPE_24G == device_type) { bt_index = 0; } else { bt_index++; } scan_mode_swtich(false); } } } else { sys_ctrl &= ~bmcu_reset; bmode_swtich_press = false; } if(0x80 == key_status) { if(!bconn_key_press) { bconn_key_press = 1; conn_key_time_count = drv_rtc_read(OM_RTC); } else { if(mMS_TO_TICK(2000) > (drv_rtc_read(OM_RTC)-conn_key_time_count)) return; if(iDEVICE_TYPE_24G == device_type) { if(iMCU_MODE_NO_DONGLE == work_mode) { if(iRF_MODE_CONNECT != rf_mode_type) { sensor_sleep(); mMCU_MODE_NORMAL; rf_mode_convert(iRF_MODE_CONNECT); } } } else if(iDEVICE_TYPE_BT2 >= device_type) { if(false == bble_conn_en) { OM_PMU->SW_RSVD1 |= RSVD1_RF_CONN_EN; NVIC_SystemReset(); } } } } else { bconn_key_press = 0; } } extern void hi5_usb_init(void); extern void usb_disconnect(void); /****************************************************************************** * º¯ÊýÃû³Æ: scan_mode_swtich() * ¹¦ÄÜÃèÊö: ģʽÇл» * ÊäÈë²ÎÊý: * Êä³ö²ÎÊý: ÎÞ * ˵ Ã÷: ÊÖ¶¯Ä£Ê½Çл»µÄʱºò£¬usbÇл»µ½ÆäËû״̬£¬²ÉÓø´Î»´¦Àí£¬ÆäËûģʽÇл»µ½USB£¬²ÉÓÃÖ±½ÓÇл» ******************************************************************************/ void scan_mode_swtich(bool powerup) { static bool busb_status, busb_status_bak; static bool b5v_check_in; for(uint8_t i=0; i<3; i++) { if(0 != USB_5V_PIN) { if(false== busb_status) busb_status = true; } else { if(true== busb_status) busb_status = false; } delayus(5); } if(false == busb_status) { // 5V¶Ï¿ª if(true == b5v_check_in) { b5v_check_in = false; usb_disconnect(); } if(true == powerup) { device_type = bt_index; return; } if(bt_index == device_type) return; device_type = bt_index; bmode_swtich_valid = true; flash_save_status(); if(iDEVICE_TYPE_BT0 == bt_index) { OM_PMU->SW_RSVD1 &= ~PMU_SW_RSVD1_RF_MDOE_MASK; OM_PMU->SW_RSVD1 |= iDEVICE_TYPE_BT0; NVIC_SystemReset(); } else if(iDEVICE_TYPE_BT1 == bt_index) { OM_PMU->SW_RSVD1 &= ~PMU_SW_RSVD1_RF_MDOE_MASK; OM_PMU->SW_RSVD1 |= iDEVICE_TYPE_BT1; NVIC_SystemReset(); } else if(iDEVICE_TYPE_BT2 == bt_index) { OM_PMU->SW_RSVD1 &= ~PMU_SW_RSVD1_RF_MDOE_MASK; OM_PMU->SW_RSVD1 |= iDEVICE_TYPE_BT2; NVIC_SystemReset(); } else //if(iDEVICE_TYPE_24G == bt_index) { OM_PMU->SW_RSVD1 &= ~PMU_SW_RSVD1_RF_MDOE_MASK; OM_PMU->SW_RSVD1 |= iDEVICE_TYPE_24G; NVIC_SystemReset(); } } else { // ¸¡¿Õ usb if(true == powerup) { b5v_check_in = true; device_type = iDEVICE_TYPE_USB; return; } if(false == b5v_check_in) { b5v_check_in = true; hi5_usb_init(); usb_ctrl_flag |= busb_suspend_resume; } if(0 != (usb_ctrl_flag&busb_suspend_resume)) return; if(iDEVICE_TYPE_USB != device_type) { bmode_swtich_valid = true; sensor_wakeup(); device_type = iDEVICE_TYPE_USB; //flash_save_status(); } } } 按区域解释代码
08-22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值