当前位置:首页 » 编程软件 » 指纹编译

指纹编译

发布时间: 2023-02-09 09:04:45

㈠ 指纹识别真的安全吗

每个人的指纹都是独一无二的,但纽约大学及密歇根州立大学的研究人员发现,两枚指纹之间的局部特征普遍存在相似性,因此手机或其它设备上的那些基于指纹的安全系统,要比想象中的脆弱的多。

系统的漏洞在于,用于身份验证功能的指纹传感器并不会捕捉用户指纹的完整图形,相反,它扫描储存的只有指纹的部分区域,而且许多手机还允许用户在系统里录入多个手指的指纹。只要用户的指纹与系统里保存的区域指纹相匹配,手机就会解锁。据研究人员推测,不同人的指纹区域之间可能存在足够的相似性,足以用来制造出虚假的“超级指纹”,从而骗过手机的指纹传感器。

该研究的合着者,密歇根州立大学计算机科学与工程系教授Arun Ross表示,许多电子设备比如智能手机均开始将指纹传感器用于用户身份验证,但手机上的指纹传感器尺寸很小,扫描录入的只有一部分指纹。为了弥补这个不足,电子设备通常会在注册过程中,要求用户录入单个手指指纹的不同区域点,以确保其中至少有一个会在身份的识别过程中与获取到的指纹图像成功匹配。而正是这一点使得情况不妙。

“由于指纹传感器的尺寸变小,提高传感器的分辨率就显得十分必要,这样才能捕捉到额外的特征点,”Arun Ross说道,“如果不提高分辨率,那么将不可避免地损害到用户指纹的独特性。研究过程中的实证分析也证实了这一点。”

Ross表示,研究团队目前正致力于如何解决这个突出的漏洞。其中包括需要开发出有效的反电子欺骗技术;在用户注册时谨慎挑选指纹的数量和类型;提高小型传感器的分辨率以便于提取更多特征点;提高利用了节点与纹理的识别技术;以及设计更有效的综合方案,从而将用户的多个指纹区域结合起来。

纽约大学计算机科学和工程研究组组长Nasir Memon称,“超级指纹”有点类似于一个黑客,试图用1234这种通用密码来破解PIN码(手机SIM卡的个人识别码)。

Memon表示:“1234这个密码大约有40%的几率是正确的,据我们估计,这个正确率有点高。”

国家科学基金会资助研究人员对8200枚指纹进行分析试验。通过商业指纹验证软件,研究人员每批次抽取800枚指纹,结果显示平均有92枚具备成为“超级指纹”的潜在可能性。(他们将“超级指纹”设计为在随机抽取的每个批次中,至少能够匹配于其中4%的虚假指纹。)

相反地,在800份完整的试验样本中,研究人员只发现了一枚完整的可用作“超级指纹”的人造指纹。Memon表示,“这并不奇怪,匹配部分指纹的成功率要比匹配一整枚指纹的高得多,然而大部分设备用来匹配的都是部分指纹。

研究人员对取自真实指纹图像的“超级指纹”的特征进行分析,建立了一个算法用于创建合成“超级指纹”。实验表明,人造的合成指纹匹配的可能性更高,与某些真实的指纹相比反而更能骗过安全识别系统。而由真实指纹结合制成的“超级指纹”成功匹配了系统中26%-65%的用户指纹,其成功率取决于用户储存了多少指纹图像,并设定了每次最多尝试匹配5次的限制。

用户在手机里录入的指纹越多,安全系统就越脆弱。

研究人员强调他们的工作是在模拟环境下完成的,但需要注意的是,人造指纹技术的发展以及将电子指纹转移到实体的技术,可能导致攻击生物识别设备的可能性提高,这是一个很严重的问题。由于“超级指纹”的高匹配度,设计值得信赖的基于指纹识别的身份认证系统正面临挑战,亟需加强方案的设计,从而利用多种因素进行身份验证,以提高系统的安全性。研究人员认为,这项研究将会影响未来安全系统设计的方向。同时,Memon表示,目前使用密码解锁手机仍是安全的。

相关论文已发表在《IEEE信息鉴定和安全》期刊上。

蝌蚪五线谱编译自scienceblog,译者 狗格格,转载须授权

凡来源署名为“蝌蚪五线谱”的内容,版权归蝌蚪五线谱所有,任何媒体、网站或个人未经授权不得转载,否则追究相应法律责任。申请转载授权或合作请发送邮件至[email protected]。本网发布的署名文章仅代表作者观点,与本网站无关。如有侵权,文责自负。

作者:狗格格/编译

㈡ MD5是如何编译的

MD5简介

MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。

Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。请注意我使用了“字节串”而不是“字符串”这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。

MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。

MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。

一些黑客破获这种密码的方法是一种被称为“跑字典”的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。

即使假设密码的最大长度为8,同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘组,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。

在很多电子商务和社区应用中,管理用户的Account是一种最常用的基本功能,尽管很多Application Server提供了这些基本组件,但很多应用开发者为了管理的更大的灵活性还是喜欢采用关系数据库来管理用户,懒惰的做法是用户的密码往往使用明文或简单的变换后直接保存在数据库中,因此这些用户的密码对软件开发者或系统管理员来说可以说毫无保密可言,本文的目的是介绍MD5的java Bean的实现,同时给出用MD5来处理用户的Account密码的例子,这种方法使得管理员和程序设计者都无法看到用户的密码,尽管他们可以初始化它们。但重要的一点是对于用户密码设置习惯的保护。

有兴趣的读者可以从这里取得MD5也就是RFC 1321的文本。 http://www.ietf.org/rfc/rfc1321.txt

实现策略

MD5的算法在RFC1321中实际上已经提供了C的实现,我们其实马上就能想到,至少有两种用Java实现它的方法,第一种是,用Java语言重新写整个算法,或者再说简单点就是把C程序改写成Java程序。第二种是,用JNI(Java Native Interface)来实现,核心算法仍然用这个C程序,用Java类给它包个壳。

但我个人认为,JNI应该是Java为了解决某类问题时的没有办法的办法(比如与操作系统或I/O设备密切相关的应用),同时为了提供和其它语言的互操作性的一个手段。使用JNI带来的最大问题是引入了平台的依赖性,打破了SUN所鼓吹的“一次编写到处运行”的Java好处。因此,我决定采取第一种方法,一来和大家一起尝试一下“一次编写到处运行”的好处,二来检验一下Java 2现在对于比较密集的计算的效率问题。

实现过程

限于这篇文章的篇幅,同时也为了更多的读者能够真正专注于问题本身,我不想就某一种Java集成开发环境来介绍这个Java Bean的制作过程,介绍一个方法时我发现步骤和命令很清晰,我相信有任何一种Java集成环境三天以上经验的读者都会知道如何把这些代码在集成环境中编译和运行。用集成环境讲述问题往往需要配很多屏幕截图,这也是我一直对集成环境很头疼的原因。我使用了一个普通的文本编辑器,同时使用了Sun公司标准的JDK 1.3.0 for Windows NT。

其实把C转换成Java对于一个有一定C语言基础的程序员并不困难,这两个语言的基本语法几乎完全一致.我大概花了一个小时的时间完成了代码的转换工作,我主要作了下面几件事:

把必须使用的一些#define的宏定义变成Class中的final static,这样保证在一个进程空间中的多个Instance共享这些数据
删去了一些无用的#if define,因为我只关心MD5,这个推荐的C实现同时实现了MD2 MD3和 MD4,而且有些#if define还和C不同编译器有关
将一些计算宏转换成final static 成员函数。
所有的变量命名与原来C实现中保持一致,在大小写上作一些符合Java习惯的变化,计算过程中的C函数变成了private方法(成员函数)。
关键变量的位长调整
定义了类和方法
需要注意的是,很多早期的C编译器的int类型是16 bit的,MD5使用了unsigned long int,并认为它是32bit的无符号整数。而在Java中int是32 bit的,long是64 bit的。在MD5的C实现中,使用了大量的位操作。这里需要指出的一点是,尽管Java提供了位操作,由于Java没有unsigned类型,对于右移位操作多提供了一个无符号右移:>>>,等价于C中的 >> 对于unsigned 数的处理。

因为Java不提供无符号数的运算,两个大int数相加就会溢出得到一个负数或异常,因此我将一些关键变量在Java中改成了long类型(64bit)。我个人认为这比自己去重新定义一组无符号数的类同时重载那些运算符要方便,同时效率高很多并且代码也易读,OO(Object Oriented)的滥用反而会导致效率低下。

限于篇幅,这里不再给出原始的C代码,有兴趣对照的读者朋友可以去看RFC 1321。MD5.java源代码

测试

在RFC 1321中,给出了Test suite用来检验你的实现是否正确:

MD5 ("") =

MD5 ("a") =

MD5 ("abc") =

MD5 ("message digest") =

MD5 ("abcdefghijklmnopqrstuvwxyz") =

……

这些输出结果的含义是指:空字符串””的MD5值是,字符串”a”的MD5值是……
编译并运行我们的程序:
javac –d . MD5.java
java beartool.MD5
为了将来不与别人的同名程序冲突,我在我的程序的第一行使用了package beartool;

因此编译命令javac –d . MD5.java 命令在我们的工作目录下自动建立了一个beartool目录,目录下放着编译成功的 MD5.class

我们将得到和Test suite同样的结果。当然还可以继续测试你感兴趣的其它MD5变换,例如:

java beartool.MD5 1234

将给出1234的MD5值。

可能是我的计算机知识是从Apple II和Z80单板机开始的,我对大写十六进制代码有偏好,如果您想使用小写的Digest String只需要把byteHEX函数中的A、B、C、D、E、F改成a、b、 c、d、e、f就可以了。

MD5据称是一种比较耗时的计算,我们的Java版MD5一闪就算出来了,没遇到什么障碍,而且用肉眼感觉不出来Java版的MD5比C版的慢。

为了测试它的兼容性,我把这个MD5.class文件拷贝到我的另一台Linux+IBM JDK 1.3的机器上,执行后得到同样结果,确实是“一次编写到处运行了”。

Java Bean简述

现在,我们已经完成并简单测试了这个Java Class,我们文章的标题是做一个Java Bean。

其实普通的Java Bean很简单,并不是什么全新的或伟大的概念,就是一个Java的Class,尽管 Sun规定了一些需要实现的方法,但并不是强制的。而EJB(Enterprise Java Bean)无非规定了一些必须实现(非常类似于响应事件)的方法,这些方法是供EJB Container使用(调用)的。

在一个Java Application或Applet里使用这个bean非常简单,最简单的方法是你要使用这个类的源码工作目录下建一个beartool目录,把这个class文件拷贝进去,然后在你的程序中import beartool.MD5就可以了。最后打包成.jar或.war是保持这个相对的目录关系就行了。

Java还有一个小小的好处是你并不需要摘除我们的MD5类中那个main方法,它已经是一个可以工作的Java Bean了。Java有一个非常大的优点是她允许很方便地让多种运行形式在同一组代码中共存,比如,你可以写一个类,它即是一个控制台Application和GUI Application,同时又是一个Applet,同时还是一个Java Bean,这对于测试、维护和发布程序提供了极大的方便,这里的测试方法main还可以放到一个内部类中,有兴趣的读者可以参考: http://www.cn.ibm.com/developerWorks/java/jw-tips/tip106/index.shtml

这里讲述了把测试和示例代码放在一个内部静态类的好处,是一种不错的工程化技巧和途径。

把Java Bean装到JSP里

正如我们在本文开头讲述的那样,我们对这个MD5 Bean的应用是基于一个用户管理,这里我们假设了一个虚拟社区的用户login过程,用户的信息保存在数据库的个名为users的表中。这个表有两个字段和我们的这个例子有关,userid :char(20)和pwdmd5 :char(32),userid是这个表的Primary Key,pwdmd5保存密码的MD5串,MD5值是一个128bit的大整数,表示成16进制的ASCII需要32个字符。

这里给出两个文件,login.html是用来接受用户输入的form,login.jsp用来模拟使用MD5 Bean的login过程。

为了使我们的测试环境简单起见,我们在JSP中使用了JDK内置的JDBC-ODBC Bridge Driver,community是ODBC的DSN的名字,如果你使用其它的JDBC Driver,替换掉login.jsp中的
Connection con= DriverManager.getConnection("jdbc:odbc:community", "", "");
即可。

login.jsp的工作原理很简单,通过post接收用户输入的UserID和Password,然后将Password变换成MD5串,然后在users表中寻找UserID和pwdmd5,因为UserID是users表的Primary Key,如果变换后的pwdmd5与表中的记录不符,那么SQL查询会得到一个空的结果集。

这里需要简单介绍的是,使用这个Bean只需要在你的JSP应用程序的WEB-INF/classes下建立一个beartool目录,然后将MD5.class拷贝到那个目录下就可以了。如果你使用一些集成开发环境,请参考它们的deploy工具的说明。在JSP使用一个java Bean关键的一句声明是程序中的第2行:

<jsp:useBean id='oMD5' scope='request' class='beartool.MD5'/>
这是所有JSP规范要求JSP容器开发者必须提供的标准Tag。

id=实际上是指示JSP Container创建Bean的实例时用的实例变量名。在后面的<%和%>之间的Java程序中,你可以引用它。在程序中可以看到,通过 pwdmd5=oMD5.getMD5ofStr (password)引用了我们的MD5 Java Bean提供的唯一一个公共方法: getMD5ofStr。

Java Application Server执行.JSP的过程是先把它预编译成.java(那些Tag在预编译时会成为java语句),然后再编译成.class。这些都是系统自动完成和维护的,那个.class也称为Servlet。当然,如果你愿意,你也可以帮助Java Application Server去干本该它干的事情,自己直接去写Servlet,但用Servlet去输出HTML那简直是回到了用C写CGI程序的恶梦时代。

如果你的输出是一个复杂的表格,比较方便的方法我想还是用一个你所熟悉的HTML编辑器编写一个“模板”,然后在把JSP代码“嵌入”进去。尽管这种JSP代码被有些专家指责为“空心粉”,它的确有个缺点是代码比较难管理和重复使用,但是程序设计永远需要的就是这样的权衡。我个人认为,对于中、小型项目,比较理想的结构是把数据表示(或不严格地称作WEB界面相关)的部分用JSP写,和界面不相关的放在Bean里面,一般情况下是不需要直接写Servlet的。

如果你觉得这种方法不是非常的OO(Object Oriented),你可以继承(extends)它一把,再写一个bean把用户管理的功能包进去。

到底能不能兼容?

我测试了三种Java应用服务器环境,Resin 1.2.3、Sun J2EE 1.2、IBM WebSphere 3.5,所幸的是这个Java Bean都没有任何问题,原因其实是因为它仅仅是个计算程序,不涉及操作系统,I/O设备。其实用其它语言也能简单地实现它的兼容性的,Java的唯一优点是,你只需提供一个形态的运行码就可以了。请注意“形态”二字,现在很多计算结构和操作系统除了语言本身之外都定义了大量的代码形态,很简单的一段C语言核心代码,转换成不同形态要考虑很多问题,使用很多工具,同时受很多限制,有时候学习一种新的“形态”所花费的精力可能比解决问题本身还多。比如光Windows就有EXE、Service、的普通DLL、COM DLL以前还有OCX等等等等,在Unix上虽说要简单一些,但要也要提供一个.h定义一大堆宏,还要考虑不同平台编译器版本的位长度问题。我想这是Java对我来说的一个非常重要的魅力吧。

MD5算法说明

一、补位
二、补数据长度
三、初始化MD5参数
四、处理位操作函数
五、主要变换过程
六、输出结果

补位:
MD5算法先对输入的数据进行补位,使得数据位长度LEN对512求余的结果是448。即数据扩展至K*512+448位。即K*64+56个字节,K为整数。
具体补位操作:补一个1,然后补0至满足上述要求。
补数据长度:
用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。这时,数
据就被填补成长度为512位的倍数。
初始化MD5参数:
四个32位整数 (A,B,C,D) 用来计算信息摘要,初始化使用的是十六进制表
示的数字
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210

处理位操作函数:
X,Y,Z为32位整数。
F(X,Y,Z) = X&Y|NOT(X)&Z
G(X,Y,Z) = X&Z|Y?(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X|not(Z))

主要变换过程:
使用常数组T[1 ... 64], T[i]为32位整数用16进制表示,数据用16个32位
的整数数组M[]表示。
具体过程如下:

/* 处理数据原文 */
For i = 0 to N/16-1 do

/*每一次,把数据原文存放在16个元素的数组X中. */
For j = 0 to 15 do
Set X[j] to M[i*16+j].
end /结束对J的循环

/* Save A as AA, B as BB, C as CC, and D as DD.
*/
AA = A
BB = B
CC = C
DD = D

/* 第1轮*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3
22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7
22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA
11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15]
[BCDA 15 22 16]

/* 第2轮* */
/* 以 [abcd k s i]表示如下操作
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA
0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23]
[BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA
8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA
12 20 32]

/* 第3轮*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35]
[BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA
10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43]
[BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47]
[BCDA 2 23 48]

/* 第4轮*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51]
[BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55]
[BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59]
[BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63]
[BCDA 9 21 64]

/* 然后进行如下操作 */
A = A + AA
B = B + BB
C = C + CC
D = D + DD

end /* 结束对I的循环*/

输出结果。

㈢ AI怎么做

人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。
人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。
人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。[1]2017年12月,人工智能入选“2017年度中国媒体十大流行语”。[2]2021年9月25日,为促进人工智能健康发展,《新一代人工智能伦理规范》发布。
用来研究人工智能的主要物质基础以及能够实现人工智能技术平台的机器就是计算机,人工智能的发展历史是和计算机科学技术的发展史联系在一起的。除了计算机科学以外,人工智能还涉及信息论、控制论、自动化、仿生学、生物学、心理学、数理逻辑、语言学、医学和哲学等多门学科。人工智能学科研究的主要内容包括:知识表示、自动推理和搜索方法、机器学习和知识获取、知识处理系统、自然语言理解、计算机视觉、智能机器人、自动程序设计等方面。

研究方法
如今没有统一的原理或范式指导人工智能研究。许多问题上研究者都存在争论。其中几个长久以来仍没有结论的问题是:是否应从心理或神经方面模拟人工智能?或者像鸟类生物学对于航空工程一样,人类生物学对于人工智能研究是没有关系的?智能行为能否用简单的原则(如逻辑或优化)来描述?还是必须解决大量完全无关的问题?
智能是否可以使用高级符号表达,如词和想法?还是需要“子符号”的处理?JOHN HAUGELAND提出了GOFAI(出色的老式人工智能)的概念,也提议人工智能应归类为SYNTHETIC INTELLIGENCE,[29]这个概念后来被某些非GOFAI研究者采纳。
大脑模拟
主条目:控制论和计算神经科学
20世纪40年代到50年代,许多研究者探索神经病学,信息理论及控制论之间的联系。其中还造出一些使用电子网络构造的初步智能,如W. GREY WALTER的TURTLES和JOHNS HOPKINS BEAST。 这些研究者还经常在普林斯顿大学和英国的RATIO CLUB举行技术协会会议.直到1960, 大部分人已经放弃这个方法,尽管在80年代再次提出这些原理。
符号处理
主条目:GOFAI
当20世纪50年代,数字计算机研制成功,研究者开始探索人类智能是否能简化成符号处理。研究主要集中在卡内基梅隆大学, 斯坦福大学和麻省理工学院,而各自有独立的研究风格。JOHN HAUGELAND称这些方法为GOFAI(出色的老式人工智能)。[33] 60年代,符号方法在小型证明程序上模拟高级思考有很大的成就。基于控制论或神经网络的方法则置于次要。[34] 60~70年代的研究者确信符号方法最终可以成功创造强人工智能的机器,同时这也是他们的目标。
认知模拟经济学家赫伯特·西蒙和艾伦·纽厄尔研究人类问题解决能力和尝试将其形式化,同时他们为人工智能的基本原理打下基础,如认知科学, 运筹学和经营科学。他们的研究团队使用心理学实验的结果开发模拟人类解决问题方法的程序。这方法一直在卡内基梅隆大学沿袭下来,并在80年代于SOAR发展到高峰。基于逻辑不像艾伦·纽厄尔和赫伯特·西蒙,JOHN MCCARTHY认为机器不需要模拟人类的思想,而应尝试找到抽象推理和解决问题的本质,不管人们是否使用同样的算法。他在斯坦福大学的实验室致力于使用形式化逻辑解决多种问题,包括知识表示, 智能规划和机器学习. 致力于逻辑方法的还有爱丁堡大学,而促成欧洲的其他地方开发编程语言PROLOG和逻辑编程科学.“反逻辑”斯坦福大学的研究者 (如马文·闵斯基和西摩尔·派普特)发现要解决计算机视觉和自然语言处理的困难问题,需要专门的方案-他们主张不存在简单和通用原理(如逻辑)能够达到所有的智能行为。ROGER SCHANK 描述他们的“反逻辑”方法为 "SCRUFFY" .常识知识库 (如DOUG LENAT的CYC)就是"SCRUFFY"AI的例子,因为他们必须人工一次编写一个复杂的概念。基于知识大约在1970年出现大容量内存计算机,研究者分别以三个方法开始把知识构造成应用软件。这场“知识革命”促成专家系统的开发与计划,这是第一个成功的人工智能软件形式。“知识革命”同时让人们意识到许多简单的人工智能软件可能需要大量的知识。
子符号法
80年代符号人工智能停滞不前,很多人认为符号系统永远不可能模仿人类所有的认知过程,特别是感知,机器人,机器学习和模式识别。很多研究者开始关注子符号方法解决特定的人工智能问题。
自下而上, 接口AGENT,嵌入环境(机器人),行为主义,新式AI机器人领域相关的研究者,如RODNEY BROOKS,否定符号人工智能而专注于机器人移动和求生等基本的工程问题。他们的工作再次关注早期控制论研究者的观点,同时提出了在人工智能中使用控制理论。这与认知科学领域中的表征感知论点是一致的:更高的智能需要个体的表征(如移动,感知和形象)。计算智能80年代中DAVID RUMELHART 等再次提出神经网络和联结主义. 这和其他的子符号方法,如模糊控制和进化计算,都属于计算智能学科研究范畴。
统计学法
90年代,人工智能研究发展出复杂的数学工具来解决特定的分支问题。这些工具是真正的科学方法,即这些方法的结果是可测量的和可验证的,同时也是人工智能成功的原因。共用的数学语言也允许已有学科的合作(如数学,经济或运筹学)。STUART J. RUSSELL和PETER NORVIG指出这些进步不亚于“革命”和“NEATS的成功”。有人批评这些技术太专注于特定的问题,而没有考虑长远的强人工智能目标。
集成方法
智能AGENT范式智能AGENT是一个会感知环境并作出行动以达致目标的系统。最简单的智能AGENT是那些可以解决特定问题的程序。更复杂的AGENT包括人类和人类组织(如公司)。这些范式可以让研究者研究单独的问题和找出有用且可验证的方案,而不需考虑单一的方法。一个解决特定问题的AGENT可以使用任何可行的方法-一些AGENT用符号方法和逻辑方法,一些则是子符号神经网络或其他新的方法。范式同时也给研究者提供一个与其他领域沟通的共同语言--如决策论和经济学(也使用ABSTRACT AGENTS的概念)。90年代智能AGENT范式被广泛接受。AGENT体系结构和认知体系结构研究者设计出一些系统来处理多ANGENT系统中智能AGENT之间的相互作用。一个系统中包含符号和子符号部分的系统称为混合智能系统 ,而对这种系统的研究则是人工智能系统集成。分级控制系统则给反应级别的子符号AI 和最高级别的传统符号AI提供桥梁,同时放宽了规划和世界建模的时间。RODNEY BROOKS的SUBSUMPTION ARCHITECTURE就是一个早期的分级系统计划。

智能模拟
机器视、听、触、感觉及思维方式的模拟:指纹识别,人脸识别,视网膜识别,虹膜识别,掌纹识别,专家系统,智能搜索,定理证明,逻辑推理,博弈,信息感应与辨证处理。

学科范畴
人工智能是一门边沿学科,属于自然科学、社会科学、技术科学三向交叉学科。

涉及学科
哲学和认知科学,数学,神经生理学,心理学,计算机科学,信息论,控制论,不定性论,仿生学,社会结构学与科学发展观。

研究范畴
语言的学习与处理,知识表现,智能搜索,推理,规划,机器学习,知识获取,组合调度问题,感知问题,模式识别,逻辑程序设计,软计算,不精确和不确定的管理,人工生命,神经网络,复杂系统,遗传算法人类思维方式,最关键的难题还是机器的自主创造性思维能力的塑造与提升。

安全问题
人工智能还在研究中,但有学者认为让计算机拥有智商是很危险的,它可能会反抗人类。这种隐患也在多部电影中发生过,其主要的关键是允不允许机器拥有自主意识的产生与延续,如果使机器拥有自主意识,则意味着机器具有与人同等或类似的创造性,自我保护意识,情感和自发行为。

实现方法
人工智能在计算机上实现时有2种不同的方式。一种是采用传统的编程技术,使系统呈现智能的效果,而不考虑所用方法是否与人或动物机体所用的方法相同。这种方法叫工程学方法(ENGINEERING APPROACH),它已在一些领域内作出了成果,如文字识别、电脑下棋等。另一种是模拟法(MODELING APPROACH),它不仅要看效果,还要求实现方法也和人类或生物机体所用的方法相同或相类似。遗传算法(GENERIC ALGORITHM,简称GA)和人工神经网络(ARTIFICIAL NEURAL NETWORK,简称ANN)均属后一类型。遗传算法模拟人类或生物的遗传-进化机制,人工神经网络则是模拟人类或动物大脑中神经细胞的活动方式。为了得到相同智能效果,两种方式通常都可使用。采用前一种方法,需要人工详细规定程序逻辑,如果游戏简单,还是方便的。如果游戏复杂,角色数量和活动空间增加,相应的逻辑就会很复杂(按指数式增长),人工编程就非常繁琐,容易出错。而一旦出错,就必须修改原程序,重新编译、调试,最后为用户提供一个新的版本或提供一个新补丁,非常麻烦。采用后一种方法时,编程者要为每一角色设计一个智能系统(一个模块)来进行控制,这个智能系统(模块)开始什么也不懂,就像初生婴儿那样,但它能够学习,能渐渐地适应环境,应付各种复杂情况。这种系统开始也常犯错误,但它能吸取教训,下一次运行时就可能改正,至少不会永远错下去,用不到发布新版本或打补丁。利用这种方法来实现人工智能,要求编程者具有生物学的思考方法,入门难度大一点。但一旦入了门,就可得到广泛应用。由于这种方法编程时无须对角色的活动规律做详细规定,应用于复杂问题,通常会比前一种方法更省力。

㈣ 什么是“油指纹”鉴定技术

资料显示,海上船舶油污染事故呈上升趋势,为调查处理这些事故,海事主管机关常运用多种调查手段,其中,溢油鉴定是一项重要的科技手段。1982年4月6日,烟台海事局水域环境监测站(中国海事局烟台溢油应急技术中心海事鉴定实验室的前身)经交通部港务监督局批准成立,交通部先后投资800多万元,建设实验室用房,配备了符合国际海事组织(IMO)推荐标准的4台套大型化学分析仪器。在20多年的发展历程中,该中心已拥有了符合IMO溢油源鉴定标准的荧光光谱仪、气相色谱仪、红外光谱仪和色质联用仪等分析仪器。利用这些先进设备,采用科学的分析方法,可分别获取海上溢油和嫌疑溢油源的“油指纹”,通过相互比对分析得出鉴定结论,为判定溢油源提供证据。同时,还可判定污染损害的范围和污染程度,并可进行水中油含量的定量分析、危险品污染的污染源鉴定和部分危险货物的性质鉴定。

另外,该站还可采用红外光谱—红外显微镜仪,测定船舶碰撞时转移油漆和嫌疑船舶油漆中有机成分的红外光谱图,经过比对分析,为判定碰撞肇事船舶提供证据。监测站所配备的具有国际领先水平的美国尼高力傅立叶变换红外光谱—红外显微镜联机系统,可对最小直径为50微米的微量油漆进行鉴定分析,并提供准确可靠的油漆物证鉴定结论。

2006年2月26日,该站和烟台海事局溢油应急技术中心合并,组建成了中国海事局烟台溢油应急技术中心。

石油是由上千种不同浓度的有机化合物组成。这些有机物是在不同地质条件下,经过长期的物化作用演变而成。因此,不同条件或环境下产出的油品具有明显不同的化学特征,其光谱、色谱图因此而不同。同时,因制造、储存、运输、使用的环节不同,更增加了油品光谱、色谱图的复杂性。油品光谱、色谱图的复杂性如同人类指纹一样具有唯一性,因此,人们把油品的光谱、色谱图称为“油指纹”。

就燃料油而言,两艘船舶即便是在同一个地方加了同一种油品,由于船舶自身情况的千差万别,其油箱“油指纹”也不会相同。就机舱舱底油污水来说,它的构成极为复杂,是混合了船机油、液压油、生活污水等液体形成的,因此世界上绝不会出现两种完全相同的舱底油。也就是说,世界上不同源头的油品不可能出现完全相同的“油指纹”。

因此,鉴定实验室利用荧光光谱仪、液相色谱仪、气相色谱—质谱联用仪等先进仪器,对送检的各种嫌疑溢油源的油样进行分析,并将检验出的“油指纹”特征与污染水域环境的溢油的“油指纹”特征进行比对,从而判定到底是哪艘船舶污染了水域环境。

溢油鉴定广泛应用于溢油污染事故调查处理中,是确定船舶溢油事故污染源的重要的科技手段之一,在污染事故调查处理中发挥着非常重要的作用。

首先,溢油鉴定技术能为船舶溢油事故调查处理提供科学有力的证据支持。在溢油鉴定技术未广泛应用之前,主管机关在海上船舶溢油事故调查处理时,为查找肇事船,一般采用询问嫌疑船舶有关当事人、勘查船舶管系和溢油现场、分析风流对溢油流向的影响、排除其他嫌疑溢油源等方法确定肇事船舶。但通过这些方法获取证据存在着随意性、不科学、不确切、易失真,证据证明力度不够等问题,尤其是船舶操作性溢油,现场证据易被人为破坏,事故调查困难。溢油鉴定技术的应用,有效弥补了其他调查手段的不足,保证了事故认定的准确性和科学性,同时也为事故的进一步处理和索赔,提供了合法有力的证据支持。

实际工作中,在溢油事故发生地距鉴定机构较远,船期紧张的情况下,调查人员可先展开初步调查,收集有关证据,然后对全部嫌疑船舶采样,将样品送往鉴定机构进行全面的技术鉴定,根据鉴定结论,并辅以其他证据最终确定肇事船舶。

其次,溢油鉴定对污染事故调查也具有很强的指导意义。一般港口、码头发生污染事故时,经常有多艘船舶同时在港,调查范围广、难度大。但是,有了溢油鉴定作技术指导,调查人员就可在污染事故发生后,迅速对全部嫌疑船舶同时采样,并送往鉴定机构,通过鉴定排除其他船舶,缩小嫌疑范围,然后集中力量对嫌疑船舶展开调查。另外,溢油鉴定技术能迅速地确定溢油来源和种类,调查人员可据此开展有针对性的调查,从而提高调查效率,最大限度地减少船舶滞港时间。

20多年来,该实验室积极开展海事行政鉴定实践与探索,充分利用高科技手段,在海事鉴定方面发挥了积极的作用,为国家挽回经济损失达9000多万元。2002年,海事鉴定实验室被交通部授予“交通行业环境监测先进单位”荣誉称号。

1991年7月26日,大片油污飘向烟台第一海水浴场,许多游客身上沾满油污,相关的旅游服务也被迫停营。实验室通过对3艘嫌疑船舶油样品鉴别分析,认定海面污油系英国籍“联期”轮所致。烟台海事局要求船方在开航前查明事故原因,但船方难以找到溢油原因。28日下午海事执法人员在“联期”轮围油栏内发现了新溢出的污油,随即带领“联期”轮船长查勘现场。“联期”轮的船长辩解说,可能是烟台港池下面有油田。后经潜水员水下对“联期”轮船体探摸,查出了船舶漏油管口。船方终于根据水下探摸情况,找到了漏油原因。至此,船方对实验室的鉴定心服口服。烟台海事局依法对该轮进行罚款,并由船方支付了海水浴场及有关单位的经济损失。

2000年6月18日,烟台港26号泊位发生烟台港开端口以来最大的港内溢油污染事故,烟台海事局水域环境监测站参与采集3条嫌疑船油样品共12个,经化验分析,得出了利比里亚籍“冷藏1”号轮的机舱舱底污油样品与海面溢油指纹特征一致的鉴定结论,为案件的侦破起到了决定性作用。随后,尽管“冷藏1”号船长百般抵赖,事故调查人员还是通过对海面溢油方向模拟分析、机舱设备检查和溢油化学鉴定,形成了一系列的证据体系,“冷藏1”号为肇事轮已确定无疑。6月21日,烟台海事局对“冷藏1”号发出处罚通知,鉴于该轮违法排污造成污染,而且不立即采取措施也不向主管机关报告,按照《中华人民共和国海洋环境保护法》有关规定,对其处以30万元的罚款,并承担全部经济损失。在法定时限内,肇事轮没有提出任何申辩,并交付了30万元人民币的罚款。这是新《海环法》生效后,海事鉴定实验室鉴定的第一个大型船舶污染案,该案件的调查处理结果作为2000年度我国向海事组织报告的案件之一。

2005年5月14日,天津新港水域发生了一起船舶溢油污染事故,当时正在港口作业的巴拿马籍“SINAR”轮和伯利兹籍“WISHES”轮均存在重大肇事嫌疑。天津海事局迅速对现场的海面溢油和两艘嫌疑外轮的舱底污油、燃料油等8个部位进行了油类取样,于17日将19个油类样品,通过特快专递发往烟台海事局,请求提供物证鉴定支援。为判明真相,海事行政鉴定实验室迅速对油样进行了系统鉴定分析,最终通过“油指纹”鉴定技术,5个小时内判定巴拿马籍船舶即为此次溢油污染肇事船,同时排除了伯利兹籍船舶的肇事嫌疑。

实验室准确而高效的鉴定技术,对调查事故真相的海事人员来说,是一个有力的工具;而对于那些在肇事之后想拒不承认的人而言,则是令他们心生畏惧的利器。

为了保证溢油事故中采样和鉴定程序的合法有效,监测站执法人员还配合中华人民共和国海事局编译完成了IMO《溢油采样与鉴定指南》;在总结20多年溢油鉴定工作经验的基础上,配合部海事局完成了《水上油污染事故调查油样品采样程序规定》,进一步统一了做法,规范了化验鉴定行为。另外,他们还承担了海事行政鉴定地位、性质研究、海事行政鉴定工作的相关保证措施研究、液相色谱、气/质联用仪溢油源鉴定方法研究,研究成果对进一步丰富海事行政鉴定理论、提高鉴定技术水平,更好地为调查处理溢油事故服务有十分重要的意义。

㈤ 软件加密与解密的前言

隐蔽软件(surreptitious software)是近十年来计算机安全研究领域新兴的一个分支。在隐蔽软件的研究过程中不仅需要借鉴计算机安全方面的技术,还会用到计算科学其他领域的大量技术,如密码学、隐写术、数字水印、软件量度(software metric)、逆向工程以及编译器优化等。我们使用这些技术来满足在计算机程序中安全存储秘密信息的需求,尽管这些需求的表现形式千差万别、各不相同。本书中“秘密”一词的意思比较广,书中所介绍技术(代码混淆、软件水印和指纹、防篡改技术以及软件“胎记”等)的使用目的是防止他人剽窃软件中的智力成果。比如,软件中使用指纹技术可以用来跟踪软件是否被盗版,代码混淆技术能够加大攻击者逆向分析软件的难度,而防篡改技术则可以使别人很难制作软件的破解版,等等。
好了,现在我们来讲讲为什么需要阅读本书,谁使用隐蔽软件以及本书将会涵盖哪些内容。
为什么阅读本书
与传统的安全研究不同,隐蔽软件不关心如何使计算机免于计算机病毒入侵,它关心的是计算机病毒的作者是如何防止他人分析病毒的!同样,我们也不关心软件到底有没有安全漏洞,我们关心的是如何隐蔽地在程序中加入一些只有在程序被篡改时才会执行的代码。密码学研究领域中,被加密数据的安全性依赖于加密密钥的隐秘性,而我们现在研究的恰恰是如何隐藏密钥。软件工程中有大量的软件量度技术,以确保程序结构良好,本书中将使用同样的技术使程序复杂难读。本书中描述的很多技术都是基于编译器优化技术研究开发的算法的,但是编译优化的目的是使编译器生成个头尽量小、运行速度尽量快的程序,而使用本书中介绍的一些技术却会使生成的程序个头又大,执行起来又慢。最后,传统的数字水印和隐写术是想办法把要隐藏的信息藏到图像、音频、视频甚至纯文本文件中,而隐蔽软件则是把需要隐藏的信息藏到计算机代码中。
那么,为什么要阅读本书呢?为什么要了解一种不能防止计算机被病毒或者蠕虫攻击的安全技术?为什么要学习一种只会让代码体积变大而执行速度变慢的编译优化技术?为什么要把精力花在一种违反了密码学基本前提(即密钥是不可能被攻击者获得的)的密码学分支上呢?
回答是,传统的计算机安全和密码学研究成果有时并不能解决实际工作中遇到的且亟待解决的安全问题。比如,在本书中将展示如何使用软件水印技术防止软件盗版。软件水印是在程序中嵌入的唯一标识(类似信用卡的卡号或者版权声明),通过这个标识,程序的某个副本就和你(程序的作者)或者客户联系在了一起。要是你发现市场上在卖自己软件的盗版光盘,就可以通过在盗版软件中提取的水印追查制作这个盗版软件的母版 当初是哪个家伙从你这里买走的。当给合作商提供新开发的游戏的测试版时,你也可以在测试版中加上数字水印。要是你感觉有人泄露了你的代码,就能(从众多的合作商中)找出肇事者,并把他送上法庭。
又比如,在程序的新版本中加上了某个新的算法,你当然不希望竞争对手也得到这个算法,并把它加到他们的软件中。这时,你就可以去混淆程序,使之尽可能变得复杂难懂,使竞争对手逆向分析软件时效率很低。而如果确实怀疑某人剽窃了你的代码,本书也会教你如何使用软件“胎记”证实你的怀疑。
再比如,你的程序中包含有某段不能为人所知的代码,并且你想确保没有这段代码程序就不能正常运行。例如,你肯定不希望黑客修改程序中的软件使用许可验证代码,或者可用于解密数字版权管理系统中mp3文件的密钥。第7章将讨论多种防篡改技术,确保受到篡改的程序停止正常运行。
听说你把密钥放在可执行文件里了?这主意实在太糟糕了!以往的经验告诉我们,任何类似“不公开,即安全” 的做法最终都将以失败告终,而且不管在程序中怎样隐藏密钥,最终它都逃不出一个足够顽强的逆向分析人员的手心。当然,必须承认你的做法也还是对的。本书中介绍的所有技巧都不能保证软件能永远免于黑客的毒手。不必保证某个东西永远处于保密的状态,也不必保证程序永远处于不可能被篡改的状态,更不需要保证代码永远不会被剽窃。除非这个研究领域有什么重大的突破,否则能指望的只是延缓对方的攻击。我们的目标就是把攻击者的攻击速度减缓到足够低,使他感到攻击你的软件十分痛苦或要付出过高的代价,从而放弃攻击。也可能攻击者很有耐心地花了很长时间攻破了你的防御,但这时你已经从这个软件中赚够了钱,或者已经用上了更新版本的代码(这时他得到的东西也就一钱不值了)。
比方说,你是一个付费频道的运营商,用户通过机顶盒来观看你提供的电视节目。每个机顶盒都是带有标签的——在代码的某个位置上存放了分配给每个用户的唯一标识(ID),这样你就可以根据用户的缴费情况决定是允许还是拒绝某个特定用户观看频道里的节目。可是现在有一个黑客团伙找到并且反汇编了这段代码,发现了计算用户ID的算法,并且在网上以低廉的价格把修改用户ID的方法卖给了网民。这时你该怎么办呢?你也许想到了使用防篡改的智能卡,不过这玩意儿并不像看上去那么难破解,这将在第11章中讲解。或者你可能想到要混淆代码,使之更难以被分析。或者你也可以使用防篡改技术使程序一被修改就自动停止运行。更有可能,你会混合使用上述各种技巧来保护代码。但是尽管使用了所有技术,你还必须要知道并且必须接受,你的代码仍然可能被破解,秘密仍会泄露(在这个案例里就是机顶盒里的用户ID仍然会被篡改)这一事实。怎么会这样呢?这只是因为“不公开,既安全”这个想法在根本上就存在漏洞。不过既然本书中介绍的所有技术都不能给你一个“完美并且长期的安全保证”,那么为什么还要使用这些技术,为什么还要买这样一本书呢?答案很简单,代码能顶住黑客攻击的时间越长,订阅频道的客户就越多,同时升级机顶盒的周期也就越长,这样你赚到的钱和省下的钱也就越多。
就这么简单。
谁使用隐蔽软件
很多知名的公司都对隐蔽软件有浓厚的兴趣。事实上很难真正掌握有关技术在实践中具体被使用的程度(因为大多数公司在如何保护自己的代码一事上绝对是守口如瓶的),但是我们还是可以根据他们专利的申请和拥有情况把他们对隐蔽软件的感兴趣程度猜个八九不离十。微软公司拥有多个关于软件水印[104,354]、代码混淆[62,62,69,69,70,70,180,378]和软件“胎记”[364]技术的专利。Intertrust公司拥有大量与数字版权管理技术相关的组合式专利,包括代码混淆和代码防篡改专利。2004年,在微软与Intertrust之间的马拉松式官司落下了帷幕之后,微软向Intertrust支付了高达4.4亿美元的专利使用费,才获得了后者所有的专利使用许可。同年,微软也开始与PreEmptive Solution公司开展商业合作[250],从而把PreEmptive Solution开发的identifier obfuscator(PreEmptive solution公司在该工具中拥有专利[351])加到了Visual Studio的工具集里。而普渡大学科研成果的副产品Arxan,因其独创的防篡改算法专利[24,305]而成功地开办了一家公司。苹果公司拥有一个代码混淆方面的专利,估计是用于保护其iTune软件的。Convera,一家从英特尔公司独立出来的企业,则着力研究应用于数字版权管理的代码防篡改技术[27,268-270]。从加拿大北方电信公司中分离出来的Cloakware公司也是这个领域里最成功的企业之一。该公司拥有他们称为“白盒加密”的专利[67,68,182],即把加密算法和密钥藏到程序代码中。2007年12月,Cloakware公司被一家主营付费电视业务的荷兰公司Irdeto以7250万美元的价格收购。即使是相对的后来者Sun Microsystem也已经提交了一些代码混淆领域的专利申请。
Skype的VoIP客户端也使用了类似Arxan[24]、英特尔[27]及本书中将要提到的[89]代码混淆和防篡改技术进行了防逆向工程加固。对于Skype公司来说,保护其客户端的完整性无疑是极其重要的,因为一旦有人成功逆向分析了其客户端软件,解析出Skype所使用的网络协议,黑客们就能写出廉价的能与Skype软件进行正常通信的程序(这样的话,人们就没有必要一定用Skype)。所以保持网络协议不公开则有助于Skype拥有一个庞大的用户群,这大概也是2005年易贝公司以26亿美元收购Skype的原因吧。实际上,使用隐蔽软件技术还使Skype公司赢得了足够多的时间,进而成为了VoIP技术的领军企业。即使这时Skype的协议被分析出来了(这一点黑客们确实也做到了,详见7.2.4节),黑客们也拿不出一个能够撼动Skype市场地位的类似软件了。
学术研究者从多种角度对隐蔽软件技术进行了研究。一些拥有编译器和程序语言研究背景的研究者,比如我们,会很自然地加入这一领域的研究,因为涉及代码转换的绝大多数算法都会涉及静态分析的问题,而这一问题则是编译优化技术的研究者再熟悉不过的了。尽管以前,密码学研究者大多不屑于研究“不公开,即安全”的问题,但最近一些密码学研究人员已经开始把密码学的相关技术应用于软件水印以及发现代码混淆技术的局限性上了。来自多媒体水印、计算机安全和软件工程方面的研究人员也已经发表了很多关于隐蔽软件的文章。遗憾的是,由于没有专门的刊物、学术会议(供研究人员相互之间进行交流),这一领域的研究进展被大大延缓了。事实上,为了使这些研究成果能被传统的学术会议和期刊接受,研究人员在不停地努力着,现在仍在努力。目前已经发表过隐蔽软件研究成果的学术会议有POPL(Principles of Programming Languages,程序设计原理)上的ACM专题研讨会、信息隐藏研讨会、IEEE的软件工程研讨会、高级密码学会议(CRYPTO)、ISC(Information Security Conference,信息安全大会)以及其他一些关于数字版权管理的学术会议。随着隐蔽软件这一领域的研究越来越成为学术研究的主流,我们有望拥有专门针对于隐蔽软件的期刊、专题讨论会甚至是研讨会,只是可惜目前为止这一切都还没有实现。
军方也在隐蔽软件上花了很多精力(和纳税人的钱)。比如,Cousot公司拥有的软件水印算法[95]专利就归属于世界上第九大国防工程承包商法国Thales集团。下面是一段引自最新的(2006)美军招标文件[303]中有关AT(anti-tamper)技术 研究的文字。
现在,所有的美军项目执行部门(PEO)和项目管理方(PM)在设计和实现有关系统时,必须在系统中使用军队和国防部制定的AT策略。嵌入式软件现代武器系统的核心,是被保护的最重要技术之一。AT技术能够有效地保证这些技术不被他国(人)逆向工程分析利用。仅仅由标准编译器编译生成而不加AT技术防护的代码是很容易被逆向分析的。在分析软件时,逆向工程分析人员会综合使用诸如调试器、反编译器、反汇编器等很多工具,也会使用各种静态和动态分析技巧。而使用AT技术的目的就是使逆向工程变得更为困难,进而防止美国在技术领域的优势被他国窃取。今后还有必要向部队的PEO和PM提供更有用、更有效并且多样化的AT工具集……研发AT技术的目的在于提供一个能够抗逆向工程分析的高强度壳 ,从而最大限度地迟滞敌方对被保护软件的攻击。这样美国就有机会维持其在高科技领域的优势或者减缓其武器技术泄密的速度。最终,美军就能继续保持其技术优势,进而保证其军备的绝对优势。
这份招标文件来自于美军导弹和空间程序(设计部门),专注于实时嵌入式系统的保护。我们有理由相信产生这份招标文件的原因是,美军担心射向敌方的导弹由于种种原因落地后未能爆炸,使敌方有机会接触到嵌入在导弹中负责引导导弹飞临目标上空的控制软件。
下面是另一段引自美国国防部[115]的文字。
进行主动式软件保护 (SPI)是国防部的职责之一,它必须开发和部署相关的保护技术,以保证含有国防武器系统关键信息的计算机程序的安全。SPI提供的是一种全新的安全防护方法,它并不(像传统的安全技术那样)保护计算机或者网络的安全,而只是加强计算机程序自身的安全。这种新方法能显着提升国防部的信息安全情况。SPI的适用范围很广,从台式机到超级计算机上面所有的程序都能使用SPI技术予以保护。它是(软件保护技术中)完整的一层,是“纵深防御”的一个范例。SPI技术是对网络防火墙、物理安全等传统安全技术的一个补充,但是其实现并不依赖于这些传统的安全设备。现在SPI技术被部署在选定的HPC中心和150多家国防部机关以及其他由商业公司参与建设和维护的军事基地。广泛地部署SPI技术将会有效地增强美国和美国国防部对关键应用技术的保护。
.上面这段话说明了什么?它说明美国国防部不仅关心导弹会不会掉到敌方领土上去,还关心在自己的安全系数和性能都很高的计算机中心运行的软件的安全。事实上,窃密和反窃密是防间谍机关和情报部门之间永恒的主题。比方说,一架战斗机上的某个程序需要更新一下,这时我们很可能就是用一台笔记本电脑连接到这架战斗机上进行更新操作。但是万一这台笔记本电脑不慎遗失了,或者干脆就被其他国家政府使用某种方法控制了,就像电影里常演的那样,这时会有什么情况发生呢?对方会马上把相关的代码拿去做逆向工程分析,并把分析的结果用于改进其战斗机中所使用的软件。更有甚者,对方会悄悄地在你的软件中加上一个特洛伊木马,并让飞机在特定的时间里从天上掉下来。如果我们不能绝对保证上述这一幕100%不可能发生的话,隐蔽软件至少可以作为安全防御的最后一道防线(至少还能做到事后的责任追究)。例如,飞机中的软件可以用有权访问相关软件的人的ID做一个指纹签名。要是哪天,在其他国家的战斗机上发现了这些代码,就可以立即对这些代码进行逆向分析,并进一步推算出谁是泄密事件的元兇。
什么?我听见你说,为什么我要对政府之间和商业巨头之间如何保护它们各自的秘密感兴趣呢?如果黑客破解了这些软件,他们也不过是通过自己的劳动换取一些微薄的利益而已啊。话虽如此,但是这些保护技术给你 带来的好处最终还是大于它给商业巨头带来的好处。理由是,对你来说,法律形式的保护措施(如专利、商标和版权)只有当你拥有足够的财力,能在法庭上把对方告倒的时候才会管用。换而言之,即使你认为某家大公司通过破解你的代码,剽窃了一个极有“钱途”的主意,你也无力通过那种马拉松式的官司在法庭上告倒微软,除非你有足够的经济实力能在这种财力的比拼中熬出头 。而在本书中讨论的保护技术(比如代码混淆和防篡改技术)则既廉价又好用,中小型企业和商业巨头均可使用。而且如果这时你去告这家大公司的话,也可以用水印或者软件“胎记”等技术,在法庭上当场拿出代码被剽窃的真凭实据来。
最后不得不简单地提一下另一类极其擅长使用隐蔽软件的人——坏蛋们。病毒的作者已经能非常成功地利用代码混淆的技术伪装病毒的代码,使之逃避杀毒软件的检测了。值得一提的是,人们使用这些技术(如保护DVD、游戏和有线电视)时经常被黑客破解,而黑客使用这些技术(如构建恶意软件)时,人们却很难抗击。
本书内容
隐蔽软件研究的目的是发明能够尽可能迟滞对手(逆向工程分析)进度,同时又尽可能地减少因为使用该技术,而在程序执行时增加的计算开销的算法。同时也需要发明一种评估技术,使我们可以说“在程序中使用了算法A之后,相对于原先的程序,黑客攻破新程序需要多花T个单位的时间,而新程序增加的性能开销是0”,或者最低限度我们也应该可以说“相对于算法B,使用算法A保护的代码更难被攻破”。特别要强调一下,隐蔽软件研究尚处于婴儿期,虽然我们在书中会把相关的保护算法和评估算法全都介绍给大家,但是这门艺术的现状却还并不理想(到时候你可不能太失望啊)。
在本书中,我们试图把当前所有有关隐蔽软件的研究成果组织起来系统化地介绍给读者。我们力争每章内容涵盖一种技术,并描述这一技术的应用领域以及目前可用的算法。第1章将给出隐蔽软件这个领域的一些基本概念;第2章用对抗性演示的模式介绍黑客逆向分析软件时常用的工具和技巧,然后针对这些工具和技巧介绍如何防范黑客的攻击;第3章详细讲述黑客和软件保护方用于分析计算机程序的技术;第4章、第5章和第6章分别介绍与代码混淆有关的算法;第7章介绍与防篡改技术相关的算法;第8章和第9章分别介绍与水印相关的算法;第10章介绍与软件“胎记”相关的算法;第11章讲述基于硬件设备的软件保护技术。
如果你是位企业管理人员,只是对隐蔽软件的研究现状和这些技术怎么应用到你的项目中感兴趣,那么只要阅读第1章和第2章就够了。如果你是位拥有编译器设计背景的研究人员,那么建议直接跳到第3章开始阅读。但是之后的章节还是最好顺序阅读。这是因为……呃,还是举个例子吧,介绍水印技术的章节中会用到在代码混淆章节中介绍的知识。当然在本书撰写过程中,我们还是尽量使各章内容都能独立成章的,所以(如果你拥有一些背景知识)偶尔跳过那么一两章也未尝不可。如果你是一位工程师,想要使用有关技术加固你的软件,那么强烈建议你仔仔细细地阅读第3章的所有内容,如果有条件的话,还应该再搞几本编译原理方面的教材恶补一下“程序静态分析”的知识。然后你就可以随意跳到感兴趣的章节去阅读了。如果你是名大学生,把本书作为一门课程的教材来阅读,那么就应该一页一页地完整阅读本书,期末别忘了做好复习。
希望本书能够做到两件事情。首先,希望能向你,亲爱的读者,证明代码混淆、软件水印、软件“胎记”和防篡改等技术里有大量妙不可言的想法,值得你花点时间去学习,而且这些技术也可以用来保护软件。其次,希望本书能把本领域内当前所有有用的信息汇集在一起,从而为隐蔽软件的深入研究提供一个良好的起点。
Christian Collberg和Jasvir Nagra
2009年2月2日(土拨鼠日)
P.S.实际上写作这本书还有第三个目的。要是在阅读本书时,你突然灵光闪现,冒出一个绝妙的主意,进而激发了你投身于隐蔽软件研究的雄心壮志,那么,亲爱的读者,我这第三个目的就算是达到了。请把你的新算法告诉我们,我们将把它加到本书的下一版里!

㈥ android studio软件怎么添加debugger指纹证书

其一是下好断点,然后用debug模式编译安装这个app; 其二是 attach process :点击菜单栏的“Run”->“Attach debugger to Android process”;然后会打开“Choose Process”窗口。选中要调试的进程,然后点击ok。

㈦ 指纹锁系统已锁定怎么办

密码锁系统已锁定的办法:在指纹锁上找到B键或者#键、在菜单界面选择用户管理功能、将手指放在指纹采集处。

1、在指纹锁上找到B键或者#键。按一下后会进入到菜单界面。

2、在菜单界面选择用户管理功能。找到登记指纹,再按一下#键进入到登记指纹界面。

3、将手指放在指纹采集处。等待指纹锁发出录入完毕的提示音,在指纹锁的显示屏上显示登记成功即可。

密码锁系统锁定要多久才能恢复

密码锁系统锁定要10分钟到半个小时之间才能恢复,密码锁系统的锁定取决于每个品牌自己设置的程序。密码是一种混淆技术,用户希望将正常的信息变成不可识别的信息。但是这种无法识别的信息部分可以重新处理和恢复,密码主要局限于个人能够理解的符号系统。

密码是根据特定规则编译的符号,用于在通信中更改双方的信息。解锁指纹密码锁失败,指纹密码锁的电路板可能有问题。密码是隐藏真实内容的一系列符号。由开放和标准的信息代码表示的信息被转换成除了通信双方之外的其他人不能读取的信息代码信息代码就是密码。

㈧ 进户门安装指纹锁有哪些弊病

指纹锁是大家现在在进行室内装修的时候都会采用的一种锁,不过,指纹锁它虽然说非常的方便,而且相对来说比较的安全,但是也有着一些难以避免的缺点,就是指纹锁它的成本是比较高的。

除此之外,现在在市面上的指纹锁其实相对来说是比较多的,各种各样的品种使得你很难辨别自己购买的指纹锁它的质量到底是怎样的,也有可能会花钱买一道不是很好的指纹锁。

㈨ android 指纹证书和包名 怎么获取

最近在做Android的平板的开发,想在桌面上预置一些第三方应用的Widget,在桌面预置Widget的方法就是要获得应用的包名和类名。
桌面预置widget的方法 在Launcher的配置文件 res/xml/default_workspace.xml中添加如下的代码:<appwidget
launcher:packageName="com.google.android.apps.genie.geniewidget"
//预置应用的包名
launcher:className="com.google.android.apps.genie.geniewidget.miniwidget.MiniWidgetProvider"
//预置应用的Provider的类名,不是Activity的类名
launcher:screen="1"//在第几屏0为第一屏,launcher:x="0"//x坐标launcher:y="0"//y坐标
launcher:spanX="4"//x方向占几个单元格
launcher:spanY="1"///y方向占几个单元格
通过logcat有时可以找到应用的包名和Provider类名,此方法不可取,容易出错。系统的widget可以通过查找相关的源码找到对应的包名和Provider的类名,但是第三方应用看不到源码,但是也可以通过反编译第三方应用,获得相应的Maifest.xml文件,找到对应的包名和Provider类名,但是此方法比较繁琐。
可以通过在Launcher中添加如下代码,可以将系统中所安装的所有 的widget的信息打印出来:
在Launcher.java中的onCreate方法中添加下面的代码:
List<=mAppWidgetManager.getInstalledProviders();finalintproviderCount=providers.size();for(inti=0;i<providerCount;i++){
ComponentNameprovider=providers.get(i).provider;Log.i("xxx",
"packagename:"
+provider.getPackageName()+
"classname:"
+provider.getClassName());}新编译Launcher,把Launcher push进去之后,执行 adb logcat -s xxx,就可以看到打印出来的Log信息,包名和Provider了类名。
桌面预置shortcut的方法:
在Launcher的配置文件 res/xml/default_workspace.xml中添加如下的代码:<favorites

㈩ 单片机指纹识别难做吗

单片机指纹识别是不难做的,因为:基于单片机系统的指纹识别方案手指按压指纹识别模块时,指纹数据被采集并传输到单片机,单片机经过识别算法对指纹数据进行处理后,把处理结果通过WiFi模块无线传输到云端参与身份识别的业务。

单片机指纹识别算法代码编译后占用上百K字节的代码空间,考虑到WiFi网络连接、应用层代码等整体上以1MB左右的Flash代码空间为宜,数据存储的需求以512KB的SRAM空间为宜。

系统工作时,在单片机指纹识别过程中需要强大的运算能力,而在没有指纹按压的时候则需要运行在低功耗状态,以适应嵌入式系统对功耗的要求。

在我们的方案中,选择了具有XIP特性的MCU,把代码存放在外置SPIFlash中并可以在系统执行,从而大大扩展了代码存储空间。外置SPI Flash中的代码在执行中由于需要内部Cache缓存,故执行速度略低。

单片机指纹识别芯片的要求是:

指纹识别芯片和主机的数据接口要求在指纹数据采集的过程中达到5Mbps以上的传输速率,低于5Mbps的数据吞吐量将影响用户体验。

UART、I2C等低速接口在吞吐量上无法达到要求,SPI接口简洁而且传输速率完全可以达到要求,是最合适的通信接口。

指纹识别芯片周期性检测Pixel传感器区域是否有手指触摸,检测到传感器有手指触摸时,会立刻采集活体检测数据。

数据采集完成后会通过中断通知Host读取,MCU读取完活体检测数据后芯片进行指纹扫描,指纹扫描开始后就会通过中断通知Host读取数据,指纹数据的扫描和Host数据的读取同步进行。



热点内容
对一个新编程 发布:2024-05-02 21:20:07 浏览:559
华为系统编译器在哪里 发布:2024-05-02 21:19:50 浏览:86
ebsco数据库检索 发布:2024-05-02 21:18:51 浏览:82
python递归创建目录 发布:2024-05-02 21:02:38 浏览:280
数据库分离与附加 发布:2024-05-02 20:56:59 浏览:40
搭建我的世界java服务器详细篇 发布:2024-05-02 20:56:59 浏览:942
string函数java 发布:2024-05-02 20:36:49 浏览:801
phplinux服务器 发布:2024-05-02 20:30:23 浏览:754
安卓在哪里安装网易官方手游 发布:2024-05-02 20:15:07 浏览:409
qq宠物的文件夹 发布:2024-05-02 20:13:46 浏览:366