单片机实例分享,自制数字示波器
示波器是最常用的电子测量仪器之一,它能把肉眼看不见的电信号变换成看得见的图像。为了携带方便,我曾经做过一台简易数字示波器(见图22.2),材料成本只有150元左右,这台数字示波器的设计思想是:简单实用,价格低廉,容易制作。
主要性能指标:
最高采样率:20MSa/s
模拟带宽:4MHz
输入阻抗:1MΩ
垂直灵敏度:0.01V/div~5V/div(按1-2-5方式递进,共9挡)
水平扫描速度:1.5µs/div~6ms/div(按1-2-5方式递进,共12挡)
垂直分辨率:8位
显示屏:2.4 英寸 TFT320×240(驱动控制芯片:ILI9325)
测量时能同时显示信号的频率、电压峰峰值,具有信号保持(HOLD)功能。
图22.2 自制的简易数字示波器
电路工作原理
图22.3 数字示波器结构框图
我们知道,模拟示波器是用阴极射线示波管(CRT)显示被测信号波形的,而数字示波器是采用LCM(LCD显示模块,含LCD及显示驱动控制芯片)显示被测信号波形。因为LCM的每一个显示像素都对应一个地址,地址要用数据表示,每一个像素的颜色也是用数据表示的。因此电路向LCM发送的是数据编码信号,这就决定了它和模拟示波器的电路结构不一样。
本文介绍的数字示波器的结构框图如图22.3所示。它由垂直输入电路、A/D转换电路、数字信号处理与控制电路、液晶屏显示电路、电源电路等部分组成。
图22.4 数字示波器电路原理图
输入的电压信号经垂直输入电路放大,以提高示波器的灵敏度和动态范围。对输出的信号取样后由 A/D 转换器实现数字化,模拟信号变成了数字形式存入存储器,微处理器对存储器中的数据根据需要进行处理,最终在显示屏上显示测量波形和相关的参数,这就是数字存储示波器的工作过程。
数字示波器的电路原理图如图22.4所示,下面分别对各单元电路进行介绍。
表22.1 垂直灵敏度和K1~K5的对应关系
1. 垂直输入电路垂直输入电路由双运算放大器LM6172和衰减电路等部分组成。对其有两个基本的要求:一是对放大倍数的控制,二是要有满足设计要求的足够的带宽。
示波器输入信号电压的动态范围很大,为了将输入信号电压调节到A/D转换电路的最佳采样范围,以便得到最合理的显示波形,在信号电压较小时要进行放大,在信号过大时要进行衰减。
示波器输入信号的频率范围也很宽,为了使垂直输入电路有较平坦的频率特性曲线,即对不同频率的信号放大电路的增益基本保持一致。为此选用了高速双运放LM6172,其带宽为100MHz,并在衰减电路中加了频率补偿电容。
电阻R1、R2、R3和继电器K1、K2、K3等组成衰减电路,衰减系数分3挡:1:1、1:10、1:100,由K1、K2、K3控制。第一级运算放大器接成电压跟随器的模式,主要起到缓冲的作用,提高输入阻抗,降低输出阻抗。第二级运算放大器接成电压串联负反馈电路的模式,其中电阻R6、R7、R8和继电器K4、K5等组成3挡增益调节电路,放大器的增益由K4、K5控制。当触点K4闭合时增益为(R6+R9)/R6;当触点K4开启、K5闭合时增益为(R6+R7+R9)/(R6+R7);当触点K4、K5均开启时增益为(R6+R7+R8+R9)/(R6+R7+R8)。按电路图中各电阻的取值,对应本级3挡的增益分别为25、12.5、5。
继电器K1~K5工作状态受单片机控制,所以垂直输入电路是一个程控放大器。垂直灵敏度和K1~K5工作状态的对应关系见表22.1(1表示闭合,0表示断开)。
2. A/D 转换电路
我们知道,A/D转换电路的作用就是将模拟信号数字化。一般把实现连续信号到离散信号的过程叫采样。连续信号经过采样和量化后才能被单片机处理。通过测量等时间间隔波形的电压幅值,并把该电压值转化为用二进制代码表示的数字信息,这就是数字示波器的采样,采样的工作过程见图22.5。采样的时间间隔越小,重建出来的波形就越接近原始信号。采样率就是每秒采样的次数,例如,示波器的采样率是10MSa/s,即每秒采样10M次,则表示每 0.1μs进行一次采样。采样率是数字示波器最重要的一项指标。
根据Nyquist采样定理,当对一个最高频率为f的模拟信号进行采样时,采样率必须大于f的两倍以上才能确保从采样值完全重构原来的信号。对于正弦波,每个周期至少需要两次以上的采样才能保证根据采样数据恢复原始波形。在数字示波器中,为了减小显示波形的失真,采样率至少要取被测信号频率的5~8倍。本文介绍的数字示波器采样率取被测信号频率的5倍,因为最高采样率为20MSa/s,所以当被测信号的带宽在4MHz以内时有比较好的测量结果。
采样率的提高受制于A/D转换芯片的工作速度,本文电路中使用的单片机ATmega16内部虽然也有A/D转换器,但其工作频率太低,不能满足数字示波器的采样要求。因此我们用了一片高速A/D转换芯片ADS830E,其最高采样率可达60MSa/s。ADS830E的转换精度为8位二进制数,即垂直分辨率为256,因为选用的LCM的分辨率为320×240,对应垂直分辨率为240,所以ADS830E完全能满足分辨率的使用要求。
ADS830E的IN(17脚)是供采样的模拟信号的输入端,CLK(10脚)是采样时钟信号输入端。每输入一个时钟脉冲就进行一次A/D转换,转换后的8位二进制数据由D0~D7输出。ADS830E的输入电压幅度可以通过11脚进行控制,当11脚接高电平时,ADS830E的输入电压范围是1.5~3.5V;当11脚接低电平时,输入电压范围是2~3V。这里选用1.5~3.5V的输入电压范围,中点电压为2.5V,中点电压由电位器RP进行调节。当IN输入电压为1.5V时,D0~D7输出的转换数据是0x00,当IN输入电压为3.5V时,D0~D7输出的转换数据是0xff,即255。
图22.5 采样的工作过程
3. 数字信号处理与控制电路
数字信号处理与控制电路由单片机ATmega16、FIFO(先进先出)存储器IDT7205、4个2输入与非门74HC00等组成。
单片机ATmega16在电路中的主要作用是:(1)对A/D转换后的数字信号进行处理,转换成LCM能接受的数据格式,输出给它显示;(2)产生ADS830E、IDT7205工作所需要的时钟脉冲信号;(3)通过按键对示波器参数进行控制调节,输出继电器的控制信号。
图22.6 倍频电路及各点的脉冲
FIFO存储器IDT7205是一个双端口的存储缓冲芯片,具有控制端、标志端、扩展端和8192×9的内部RAM阵列,12ns的高速存取时间。内部读、写指针在先进先出的基础上可进行数据的自动写入和读出。当有数据输入到数据输入端口D0~D8时,可由控制端Wclk来控制数据的写入。为了防止数据的写溢出,可用标志端满FF、半满HF来标明数据的写入情况,写入时由内部写指针安排其写入的位置。由于内部RAM阵列的特殊设计,先存入的数据将被先读出。如果需要数据外读,则可由控制端Rclk来控制数据的读出。RST为复位端。Wclk、Rclk、RST均由单片机ATmega16提供控制脉冲。数据输出端口Q0~Q8是三态的,在无读信号时呈高阻态。输入数据位D0~D8和输出数据位Q0~Q8均为9位,这里输入和输出均只使用了8位,即只使用了D0~D7和Q0~Q7。
读到这里,有的读者可能会问:把ADS830E输出端口D0~D7输出的数据直接输入ATmega16的PA端口不就行了吗,为什么还要在中间加上一个IDT7205?这是因为ADS830E工作速度比ATmega16快得多,即ATmega16读取数据的速度比ADS830E输出数据的速度慢,如果直接相连ATmega16就拖了ADS830E的后腿。加上IDT7205后就起到了缓冲的作用,ADS830E转换的结果先存在IDT7205内,等到ATmega16需要时,再从IDT7205中读出来。
ADS830E的采样时钟与IDT7205的写信号时钟是同一个时钟源,以确保两者同步。时钟脉冲信号由ATmega16使用内部定时器产生,由于ATmega16外接晶体的频率为20MHz,所以产生的时钟信号最高频率只能达到10MHz,为了使采样率达到20MSa/s,使用了74HC00等构成的倍频电路。若ATmega16 PD7端输出的脉冲信号频率为f,则74HC00的F4输出的脉冲信号频率为2f,倍频电路的工作过程和各点脉冲信号时序关系如图22.6所示。
K1~K5是干簧继电器,干簧继电器特点是吸合和释放时噪声很小,功耗低。因其吸合电流较小,所以可直接用ATmega16的输出端口驱动。
SB1~SB5是示波器调节按钮。SB1、SB2是水平扫描速度调节按钮,按SB1时μs/div的值增加(水平扫描速度减小),按SB2时μs/div的值减小(水平扫描速度增加);SB3、SB4是垂直灵敏度调节按钮,按SB3时V/div的值增加(垂直灵敏度减小),按SB4时V/div的值减小(垂直灵敏度增加);SB5是波形保持(HOLD)按钮,按一下测量波形被冻结保持,同时在显示屏上显示字符“HOLD”,再按一下又恢复到正常测试状态。所有调节参数均显示在液晶屏上,调节好的参数将自动保存到ATmega16的EEPROM中,下次开机时有关参数将预设在上次关机前的设定值上。
4. 显示电路
LCM采用2.4英寸TFT彩色液晶屏,分辨率为320像素×240像素,驱动控制芯片为ILI9325,该芯片传递数据8/16接口位兼容,使用8位接口时能够节省单片机的输出端口,在8位接口工作状态时16位数据分两次传递,速度稍慢。数据端口D0~D15中的高8位D8~D15为8位接口使用的端口。8/16接口位的选择由端口IM0控制,IM0接高电平时为8位接口工作状态,IM0接低电平时为16位接口工作状态。
电路中ILI9325的工作电压是3V,ATmega16的工作电压是5V,两者高电平不一致,通信端口相连时要进行电平转换,因为这里只需要ATmega16向ILI9325单向传递数据,所以只需要将5V向3V电平转换,不需要将3V电平向5V电平转换,就不必使用专用的电平转换芯片,只要用电阻分压电路将5V高电平转换成3V高电平就行了。电路中R14~R35组成电阻分压电路,连接端口有8个数据端口和3个控制端口。
5. 电源电路
这个数字示波器使用了交流电源,提供+5V、−5V、+3V三种直流电压。
程序设计
设计好电路只是为数字示波器奠定基础,更重要的是单片机程序的设计。实际上在设计硬件时既要考虑到功能,也要考虑到程序设计的需要。比如对单片机的选型,主要考虑功能、工作速度、端口的数量、程序存储器Flash的容量、RAM的容量、有没有EEPROM等。综合考虑后选用AVR单片机ATmega16,它的程序存储器Flash为16KB,RAM为1KB,使用时将16MHz的时钟频率超频到20MHz,经过对其资源合理分配,完全可以满足设计要求。
程序的开发环境为ICC-AVR V6.31A,使用 C语言编写。程序采用了分时控制、顺序调度的工作方式,没有使用任何中断程序,程序流程图如图22.7所示。
图22.7 程序流程图
下面对主要部分进行分别介绍。
1. 垂直灵敏度控制
按钮SB3、SB4用来调节垂直灵敏度,按动后通过键盘扫描程序可以增加或减小程序中变量Key_ver的值,Key_ver取值范围为1~9,分别对应9挡垂直灵敏度,通过Key_ver的取值控制继电器K1~K5的工作状态,从而得到相应的灵敏度。
以K1为例,K1接ATmega16的PB0端口,有关宏定义为:
#define K1_ON PORTB &=~(1<
#define K1_OFF PORTB |= (1<
因此,K1_ON表示PB0输出低电平,K1闭合,触点接通;K1_OFF表示PB0输出高电平,K1释放,触点断开。
2. 水平扫描速度控制
水平扫描速度控制是通过改变A/D转换电路的采样率来实现的,按动SB1、SB2可以改变程序中变量Key_hor的值,Key_hor取值范围为1~12,分别对应12挡水平扫描速度。
A/D转换电路所需的采样时钟脉冲用ATmega16的8位定时器/计数器2-T/C2产生,选择CTC工作模式。其工作参数主要由控制寄存器TCCR2、计数寄存器TCNT2、输出比较寄存器OCR2决定。TCCR2中的位CS22、CS21、CS20的取值确定T/C2的时钟源的分频系数,OCR2中的数据用于同TCNT2中的计数值进行连续的匹配比较,一旦TCNT2计数值与OCR2的数据相等,单片机端口OC2的输出电平即取反,这样即可输出脉冲信号。脉冲信号的频率f由时钟源的分频系数和OCR2的预置值决定,计算公式为f=时钟源频率/(2×(1+OCR2)),OC2输出的脉冲信号经倍频后作为采样时钟信号,相关参数之间的关系见表22.2。
只要对寄存器TCCR2、OCR2的值进行设置,就可以获得我们所需频率的采样时钟信号。
3. 数据的存储和读取
ADS830E的采样数据存入IDT7205后达到一定数量就停止采样,再将IDT7205存储的数据读入ATmega16,程序中用一个数组RAM[650]来存储读取的数据,存储容量为650,即一次读取650个采样数据。
仔细看了电路图的读者可能会发现,IDT7205的满FF端口并没有使用,为什么不用呢?这是因为ATmega16的RAM容量只有1KB,只能分配约650个存储单元用来存储从IDT7205读取的数据,IDT7205存多了数据也没有用,ATmega16不能全部存储,多余的数据就丢弃了,还不如少读点数据节省时间,提高显示波形的刷新频率。这在采样时钟频率较低时效果尤为明显,因为采样时钟频率越低,采集一个数据所花的时间越长。以采样时钟频率5kHz为例,如果要将IDT7205存满8192个数据,所需要的时间为8192/5000≈1.6s, 显示波形1.6s以上才能刷新一次,这显然是不行的。如果存满700个就结束,则所需要的时间为700/5000=0.14s,刷新速度提高了很多。
从上面的分析可以看出,FIFO存储器其实使用IDT7202就够了,IDT7202有1024个存储单元。不过笔者只买到了DIP封装的IDT7205,虽然有点大材小用,但为以后数字示波器升级提供了空间。FIFO存储器存储数据的容量称为数字示波器的存储深度,也称记录长度,存储深度也是数字示波器的一个重要技术指标,适当存储深度便于对显示波形进行分析和处理。
不使用FF端口是如何控制IDT7205存储数量的呢?我在IDT7205存储数据时根据不同的采样时钟频率设置了不同的延时时间,在此时间内能存入多于700个数据即可。延时结束后即将IDT7205的存储数据读入ATmega16。
表22.2 相关参数之间的关系
由于ADS830E每次重新进入工作状态要有一个稳定的过程,开始采样的几个数据精度不高,因此在读取IDT7205数据时先空读50个数据,将这些数据丢弃,然后再将后面的数据读入ATmega16。
图22.8 显示区域
4. 数据计算处理
数据计算处理工作主要包括同步触发信号检测、信号电压峰峰值测量、信号频率测量。这部分程序设计的思路是:
先在650个数据的前350个数据中以显示屏的垂直中点对应数据120为基准,找到同步触发信号。之所以在前350个数据中找同步触发信号,是为保留后面至少有300个数据供显示波形用。找到同步触发信号后,则把对应该点数据为起点的连续300个数据作为显示数据。
然后找到650个数据中的最大值和最小值,求最大值和最小值的算术平均数,即可得到中点电压值,检测信号相邻两次向上穿过中点的时间差即可计算出信号的周期。
5. LCM的控制与显示
TFT-LCD显示屏的分辨率为320像素×240像素。显示屏的每一个像素都对应着驱动控制芯片ILI9325内部存储器唯一的一个地址(x,y),x为横坐标,寻址范围为0~319;y为纵坐标,寻址范围为0~239。在像素对应地址写入16位颜色数据就可以显示相应的颜色,如果某一点要清除,只要对该像素对应的地址写入背景色就可以了。由于这里ILI9325采用8位接口工作模式,因此传递16位数要分两次进行。
因为数字示波器既要显示被测信号的波形,也要显示有关的测量数据,如电压峰峰值、频率、水平扫描速度、垂直灵敏度等,所以必须对显示区域进行合理的划分,并对颜色进行规划设置,分配好的显示区域如图22.8所示。图中用来显示波形的区域为中间的300×200。在这个区域画了刻度线,将水平方向分成10格,垂直方向分成8格。其余区域用来显示各种数据。
对ILI9325最基本的操作有两种:发送命令和发送数据。无论是显示屏的初始化,还是设置显示地址和显示颜色,都要用到这两种基本操作。
显示被测信号波形的过程是:先清除上一帧显示波形,然后画刻度线(刻度线每次都要重画,因为有些和显示波形交叉的点也被清除了),最后画新的一帧信号波形,同时备份数据作下一次清除用。显示信号波形时,存储器地址(x,y)中的x代表水平扫描信号所处的位置,y代表信号电压的大小。每次刷新信号波形时,信号电压峰峰值和信号频率显示数据也同时刷新一次。水平扫描速度和垂直灵敏度的数据只有在重新调整后才刷新。
表22.3 主要元器件清单
元器件选择
主要元器件的清单见表22.3。
经过试验,我发现在工作电压为5V时,单片机ATmega16和ATmega16L在时钟频率为20MHz下均能正常工作。因此,如果你手头只有ATmega16L也可以使用。
IDT7205如果使用PLCC封装的芯片,请注意引脚编号不同。
干簧继电器也可以选用其他型号的,只要工作电压是5V,闭合电流小于20mA即可。
机箱我选用的是成品塑料机箱,你也可以用其他样式的,或者自己用有机玻璃DIY。
显示屏和ADS830E的两块转接板是必须要用的,不然无法在万能板上安装,可以设法和元器件一起采购。
图22.9 缓冲区对比图
图22.10 开关单独安装在小的万能板上
显示屏的品牌很多,你很难买到和我一样的品牌。但有一点要注意,驱动控制芯片一定要是ILI9325的,如果不是,你就要修改程序了,不同的芯片即使是同一系列,驱动程序也往往不兼容。即使驱动芯片一样,不同品牌的显示屏引脚编号也可能不一致,接线时要仔细对照。另外有一点提醒一下:我买的显示屏的4个背光二极管是并联的,我是把它们公共的阳极串接一个电阻(不知道模块内部有没有限流电阻,还是外接一个电阻保险)接到+5V电源,如果你买的显示屏的背光二极管是串联的,要求的工作电压就高了,接到+5V是不能发光的,可串连一个100Ω(电阻的取值使发光二极管工作电流不超过20mA为宜)接到LM7805的输入端,此处的电压约有10V,可以满足驱动要求。
安装
安装前先将目标文件dso.hex写入单片机ATmega16,特别提醒一下:用编程器将目标文件调入时要选择“缓冲区预先填充00”选项,否则在显示屏显示字符时会出现色块。如果你用下载线写入文件,则往往不提供该选项给你选,会直接把缓冲区都填入了FF,见图22.9上半部分,这时你可以手工编辑一下,把方框中的FF全部改为00,结果见图22.9下半部分。
5个按钮开关单独安装在小的万能板上,见图22.10。其余的元件除显示屏直接固定在机箱面板上外,都安装在大的万能板上。接线时注意同一单元要一点接地,数字地和模拟地要分开。三端稳压器LM7805要加一个小的散热片。
机箱的面板根据显示屏的大小、按钮开关和BNC插座的安装位置开孔,面板上的标记可打印在一张纸上,再用1~2mm的透明有机玻璃做一块尺寸一样的面板(对应显示屏的位置不开窗口,正好做防护屏),再把打印好的纸夹在两层中间,用螺丝固定好后,面板就做好了。
按钮开关电路板是直接用4个螺丝固定在面板上的,显示屏可用热熔玻璃胶固定,把显示屏在窗口摆正位置后,在4个角用热熔玻璃胶固定一下就可以了。
安装好的示波器内部结构见图22.11。
图22.11 安装完成的内部结构
调试
如果安装时没有接线错误,元器件没有质量问题,调试还是比较容易的。
调试分4步进行。
(1)各单元先不接电源,测量电源部分输出电压是否正常,正常后再接通各部分的电源。
图22.12 水平扫描线与中线未重合
图22.13 补偿电容与方波波形的关系
图22.14 调试好的示波器的使用效果
(2)检查显示屏工作是否正常,接通电源,显示屏初始化后先是全屏显示白色闪亮一下,然后显示刻度线和相关数据。如果开机后显示屏没有反应,先检查单片机有没有正常工作,如按动K3、K4继电器的工作状态应该有所改变。如正常再查显示屏的连线和供电是否正常,直至显示正常才能进入下一步。
(3)将示波器输入端信号线短接,调节电位器RP,使其中点电压为2.44V(注意不是1.5~3.5V的中点电压2.5V,因为显示屏垂直方向中点的值是120,120是2.44V电压经A/D转换后对应的值,对应2.5V电压的A/D转换值是255/2),这时候可以看到一条水平扫描线出现在水平中线附近,见图22.12,仔细调节RP,使得其和水平中线重合。
(4)对衰减器的频率补偿电容进行调整,将垂直灵敏度调到0.5V/div,输入 200kHz、幅度1V的方波,改变电容C2的容量,使示波器显示的方波波形最好;再将垂直灵敏度调到1V/div,输入200kHz、幅度2V的方波,改变电容C3的容量,使示波器显示的方波波形最好。频率补偿电容与方波波形的关系见图22.13。
装配调试好的数字示波器的使用效果见图22.14。
交易鉴权之软证书与硬 ukey
最近一直在思考交易鉴权以及对于交易有效性举证的问题,记下来对此的一些知识点与思考,希望能抛砖引玉。其中涉及到《电子签名法》的部分内容,虽然我的大学专业中也带了一个“法”字,但是毕竟是“法语”不是“法律”。也和几位做法务领域的朋友交流过,但是《电子签名法》相对小众且新潮,欢迎各位有《电子签名法》实操经验的法务大神吐槽。
一、目前的交易鉴权模式
其实这一段纯碎是为了凑字数,我想任何一个做 PM 的同学都会说上绝大多目前市面上广泛使用的交易鉴权方式。
1. 账号+密码
账号+密码是目前最普遍的验证方式,还有的业务会增加交易密码二次验证。方案很成熟,也很基础。借用在讨论交易安全时,我们的一个资深开发小哥哥的一句话来证明:(在我们说了问题之后,小哥哥默默的来了一句)我对我的编程生涯第一次产生了怀疑,难道我连登陆系统都写不了了么?账号+密码的方案用户接受程度最高,可以作为登陆等非关键操作的验证方式。
对于这一块,我曾经在《互金产品基础知识(三)作为 P2P 产品经理,你要知道的融资端风控问题》[1]写到一些。
2. 密码控件
作为上一种鉴权方式的加强版,通过使用密码控件来在保证密码输入框安全,保证密码不被窃取:软键盘防止键盘监听、星号显示防止被偷看;加密传输防止网络窃取。目前主要的厂商有科篮、飞天等。
但是安全控件兼容性差,必须用 windows+IE 浏览器,且无法应对键盘记录器等木马(当然,有一些安全控件还有软键盘功能),随着目前账号风控体系的完善,已经很少有系统在使用了。先不考虑。
3. 生物识别
主要利用指纹、人脸、虹膜等不可变的生物特征进行识别。目前比较广泛的是指纹和人脸识别。
随着各种生物识别设备的普及被窃概率不断增加,且生物特征不可变更,识别准确率不高。之前有过通过三张照片,小视频之类的突破银行存管开户的案例。不过作为一个发展中的技术,我相信生物识别的能力会越来越强。
4. 图形验证码
图形验证码并不是一个狭义的交易鉴权方案,它只能算是人机对抗、过滤机器人(虚假用户)的一个方案。
图形验证码存在着一个天然的悖论:太简单会被机器破解起不到过滤作用,太复杂则会给真实用户带来影响;另外随着现在机器学习图片识别技术的发展,图形验证码(包括其变种模式)已经越来越难起到作用。还有就是现在的打码平台,本质就是个人在输入验证码,单纯依靠图形验证码(不考虑其他辅助措施,比如ip风控、机器指纹识别等)怎么来过滤。
5. 手机验证码
手机验证码是目前比较广泛的鉴权方案,但是手机病毒、伪基站、盗换/复制 SIM 卡等办法都可以进行攻击。当然随着 GSM 网络的退网,伪基站和复制 SIM 卡的方法可能会绝技,但是手机病毒多半估计无法彻底灭绝。
人民银行办公厅曾经在2016年专门下发过《金融业信息安全风险提示》,提示手机验证码短信被黑客拦截的手段、风险和后果。
6. 动态密码锁
就是将军令那种东西, HOTP 事件同步或 TOTP 事件同步,一次性口令生成。我曾经写过《给产品经理讲技术-Google验证的原理及应用场景》[2],有兴趣的可以去看看。
但是问题也很明显:需要多携带一个设备(口令工具)或多安装一个 app,另外目前众多算法已经被公开,安全性较差。
7. 动态口令卡
就是一张卡片,每张动态口令卡覆盖有若干个不同的密码。在启用动态口令卡后,进行交易时,需按顺序输入动态口令卡上的密码。
这东西绝对是逆历史潮流的,每张口令卡覆盖的密码有限,每个密码只可以使用一次。用尽后需要重新更换,局限性大。除非你家公司可以在全国任何一个县乡都有点(比如国有大银行爸爸们),否则你还是不要想了。另外密码都在口令卡上以明文方式存在,容易泄漏。
8. 数字证书
数字证书是用于公开秘钥基础建设(PKI 体系)的电子文件,用来证明公开密钥拥有者的身份。此文件包含了公钥信息、拥有者身份信息(主体)、以及数字证书认证机构(发行者)对这份文件的数字签名,以保证这个文件的整体内容正确无误。拥有者凭着此文件,可向计算机系统或其他用户表明身份,从而对方获得信任并授权访问或使用某些敏感的计算机服务。
计算机系统或其他用户可以透过一定的程序核实证书上的内容,包括证书有否过期、数字签名是否有效,如果你信任签发的机构,就可以信任证书上的密钥,凭公钥加密与拥有者进行可靠的通信。
数字证书的其中一个最主要好处是在认证拥有者身份期间,拥有者的敏感个人数据(如出生日期、身份证号码等)并不会传输至索取数据者的计算机系统上。透过这种数据交换模式,拥有者既可证实自己的身份,亦不用过度披露个人数据,对保障计算机服务访问双方皆有好处。
数字证书必须存储在指定的安全位置中,比如注册表、本地或远程计算机、磁盘文件、数据库、目录服务、智能设备或其他位置。
二、关于数字证书
在以上几种鉴权的方式中,认证效力最高、最安全的应该数字证书了。那数字证书是怎么来的呢?和我们文章标题所说的软证书和硬 key 又有什么关系呢?
我从网上找到一张图来说明数字证书的产生:
用户向 RA 申请证书;RA 对用户提交的信息进行核实后向 CA 提出注册请求。CA建立对于该用户的注册,并将注册建立结果返回给RA。
RA将注册结果通知用户,注册结果中包含了两组数字,分别称为“参考号”和“授权码”。(两码)
用户方的软件生成一对公钥和私钥。用户向CA提出证书请求,这个请求信息中还包含了用户的公钥和用户的可甄别名等信息,这些信息在CA创建证书时要用到。
CA创建该用户的数字证书。通过适当方式将证书分发给用户,适当的方式包括:Out-of-band Distribution带外分发、In-band distribution带内分发等多种概念,就不展开了,有兴趣的可以私聊。
——(来源:《CFCA 数字证书的存储和USBKey的安全性》[3])
数字证书是在PKI体系框架下公钥的表现形式。那么数字证书和私钥到底存储在哪里呢?这就引出了我们今天的题目:软证书和硬 key 。
我们所说的软证书和硬 key 其实指的是我们数字证书和私钥存储在哪里的问题。
软证书一般是将文件存放在电脑/移动设备的指定位置里,比如 Windows 会将数字证书存储在注册表(HKLM(HKCC)SoftwareMicrosoftSystemCertificates)和用户配置文件(%USERPROFILE%Application DataMicrosoftSystemCertificatesMy)中。而对应的私钥存处在用户配置文件(计算机:%ALLUSERSPROFILE%Application DataMicrosoftCryptoRSA(DSS)Machine Keys;用户:%USERPROFILE%Application DataMicrosoftCryptoRSA(DSS))中。 大家有兴趣可以去找找。
而硬 key 则是将私钥和数字证书导入到设备中。这个设备内置单片机或智能卡芯片,可以存储用户的密钥或数字证书。
这两种存储方式只要是安全性的差别:
软证书是以文件形式保存的,并且可以标记允许再次导出,极易受到木马等攻击。另外,软证书不强制用户设置证书使用口令,其他人登录同一台电脑就可以直接使用。曾经出现过银行软证书被攻破的案例,大部分银行在 2008 年以后逐步取消了软证书的网上支付功能。
硬证书则是以UKey移动设备为载体,通过 PIN 码保护 key,且密钥一旦导入 USB-KEY 中,及不可被导出。(甚至无法删除,我和 CFCA 的技术支持确认过这件事,除非我使用专用软件格式化掉这个 Ukey。)
在推荐国标 GB/T 25065-2010 《信息安全技术公钥基础设施签名生成应用程序的安全要求》中也提到安全签名生成设备 SSCD(用来存放签名人的电子签名制作数据,验证签名人鉴别数据,使用电子签名制作数据产生电子签名)需要是:
智能卡USB 令牌PCMCIA 令牌并应符合国家密码主管部门的相关要求。另外,目前第三方电子合同平台大部分采用的是云托管证书的方案,秘钥在云端存储,不需要任何介质,只需要通过口令(比如密码或者短信验证码)就可以随时随地的进行签名。(说实话,考虑到头部公司的技术实力,我觉得这种方案都比软证书安全,毕竟秘钥是存在一个有着相应技术能力维护的服务器上,而不是存在一些完全不懂电脑的普通人的电脑里。)
我们知道基于密码或短信验证码属于弱身份认证手段,攻击门槛低,容易发生秘钥泄露的事件。同时第三方电子合同平台作为托管方理论上(不考虑内控、法律和道德)在一定利益的驱使下是有条件冒充用户替客户签名的。
从国密局至今只为一家云托管方案发放了商用密码产品型号证书来看,这个行业还无法满足可靠电子签名的一些条件。(当然我们也应该看到这些第三方电子合同厂商做的努力,通过完善证据链来修补可靠数字签名的瑕疵,不加这句话我是不是会被电子合同厂商的朋友们骂死……)
另外,国密算法证书标注启用后,国家密码局强制要求不再提供软证书哦。(现在很多金融领域已经被监管要求将加密方式转向国密标准,主要是为了自主可控,这可不是为了什么特色,而是真的有必要。详见 NSA 在 RSA 加密算法中安置了后门——RSA BSAFE[4]。)
关于安全性还有个一个例子从侧面来印证:某家 CA 厂商(就是你们知道的最牛B 的那个),在一次交流中说我们给我们发的软证书上了保险,出现意外保XX;给 XX 项目上来保险,出现问题保 XX。
我问说你们的硬件 key 赔多少?小哥回答我说,我们没上保险,因为ukey 理论上只有可能因为用户的保管原因造成损失……
三、讲完技术讲法律
理论上说,数字证书的基本原理是基于非对称密码机制的 PKI 体系,这个体系和算法(RSA)都是公开的技术并不复杂。Adobe Acrobat 可以很方便的为你的 PDF 增加签名。
但是!在我国有一部法律叫做《电子签名法》(其实包括美国、欧盟等国家和地区都有相关的理发),估计做互金的小伙伴前段时间会被电子合同服务商的商务同时刷屏一波,对就是最近刚刚修正过的《电子签名法》。
《电子签名法》规定对于从事电子认证服务的机构采取「资质许可」的形式来确保 CA 机构的权威、公正和可信赖(《电子签名法》第十八条)。截止2018年4月22日,在工信部网站上公示的电子认证服务机构一共37家。
数据来源:工信部-数据资料库-电子认证服务机构设立审批[5]
同时,它还对可靠的电子签名做出了规定,其中提到:(二)签署时电子签名制作数据仅由电子签名人控制。(《电子签名法》第十三条)
同时《电子签名法》第二十八条:电子签名人或者电子签名依赖方因依据电子认证服务提供者提供的电子签名认证服务从事民事活动遭受损失,电子认证服务提供者不能证明自己无过错的,承担赔偿责任。也就是说,电子认证服务提供者需要承担的推定过错责任。
在举证过程中,电子认证服务者举证一个 U 盘大小的 key 介质似乎要比举证数据文件的所有权容易也直观多了。
另外,还有人一直在和我讨论自建 CA 是否有效的问题。比如四大行的 CA 体系(中行除外,他们用的 CFCA 的)。《电子签名法》第十八条明确指出:从事电子认证服务,应当向国务院信息产业主管部门提出申请……予以许可的,颁发电子认证许可证书……
不过很显然,他们并没有工信部的认可。那是不是是不合法的呢?
也不尽然,《电子签名法》第十三条:当事人也可以选择使用符合其约定的可靠条件的电子签名。第十六条:电子签名需要第三方认证的,由依法设立的电子认证服务提供者提供认证服务。
针对这两条,我发现不同人的解释不太一样,我更倾向于:在双方认可前提下且不需要第三方认证的,可以使用自建 CA。更像是一种擦边球行为,因为有人认为自建 CA 只能在自己系统内部,不如小璋 CA 在小璋集团内部作为文件签署使用,而不能向社会第三方提供服务。不过咱也不知道,咱也不敢问。《电子签名法》任重而道远啊。
关于数字签名及电子合同,我还有一篇文章,有兴趣的可以去看看:【小璋的笔记】电子合同是个啥[6]
相关阅读
[1]《互金产品基础知识(三)作为 P2P 产品经理,你要知道的融资端风控问题》:http://www.woshipm.com/pmd/696772.html
[2]《给产品经理讲技术-Google验证的原理及应用场景》:http://t.cn/AiN4vEwy
[3]《CFCA 数字证书的存储和USBKey的安全性》:http://t.cn/AiN4P7rs
[4] RSA BSAFE:http://t.cn/AiN4P7dv
[5] 工信部-数据资料库-电子认证服务机构设立审批:http://t.cn/RnMdgKm
[6]【小璋的笔记】电子合同是个啥:http://www.woshipm.com/pmd/1036833.html
#专栏作家#
张小璋,公众号:张小璋的碎碎念(ID:SylvainZhang),人人都是产品经理专栏作家。野蛮生长的产品经理,专注于互联网金融领域。
本文原创发布于人人都是产品经理。未经许可,禁止转载。
题图来自 Pexels,基于 CC0 协议
相关问答
懂的进!八个LED灯与 单片机 P1口连,按键 key 1与 单片机 P32连....[最佳回答]假如,你的程序在执行key_scan();是触发了两次中断导致num>20,你的显示函数将永远被跳过,你应该写成if(num>20)��{���num=0;���display();�.....
51 单片机 怎么定义按键?在51单片机中,可以通过以下步骤定义按键。首先,选择一个IO口作为按键输入口,将按键连接到该IO口上。然后,在程序中设置该IO口为输入模式。接着,通过读取该...
【求大家帮忙解释下这段51 单片机 代码是什么意思,谢了!bitsca...[最佳回答]key_s=0x00;//清0key_s|=K2;//将K2的值赋给key_s;;;K2应该是Pxkey_s<<=1;//之后丢掉最高位即K2中的最高位是没有用的ke...
usbkey优缺点?USBKey是一种USB接口的硬件设备。它内置单片机或智能卡芯片,有一定的存储空间,可以存储用户的私钥以及数字证书,利用USBKey内置的公钥算法实现对用户身份的...
51 单片机 里的IF判断?if(flag==0){if(!key1)key1=1;if(!key2){key2=1;}}//如果标志为真,再判断KEY1=0,判断KEY=0则分别将它们置1if(flag==...
请问 单片机 怎么用独立按键按一下实现一个功能,按另一个按键实现另一个功能,这个代码要怎么写啊?如果这两个功能都是一个死循环,可以考虑用中断,这样就不必在两个独立的功能中插入按键检测了while(1){while(flag==1){死循环1}while(flag==2){死循环2}}....
单片机 的独立键盘有什么用?很多的嵌入式或者单片机系统中,一般都需要向嵌入式或者单片机系统输入信息的外设,以及嵌入式或者单片机向外输出信息的外设我们常见的显示屏,数码管等就是嵌...
51 单片机 1按键切换3种不同状态的c程序?主程序大致是这样的flag=0;//记录按键次数While(1){if(key==0){delayms(20);if(key==0)flag++;}//按键检测if(flag==3)flag...
51 单片机 用1个按键点亮LED灯,另1个按键关?//假设按键输入P1.0,P1.1,LED控制P2.0,都是低电平有效#include"reg51.h"sbitKEY0=P1^0;关灯按键sbitKEY1=P1^1;开灯按键sb...
单片机 是如何控制步进电机扎旋转的?voidKeyDriver(){unsignedchari,j;staticunsignedcharbackup[4][4]={//按键值备份,保存前一次的值{1,1,1...