热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

提交客户端证书_密码技术的典型应用——使用证书登录系统

在实际开发中,经常遇到使用证书登录业务系统的需求。即用户登录系统前需要插入自己的USBKey证书,登录时输入Key的口令完成登录。其实前面那篇SSL文章已经介绍过&#
bbe4b258446fd35d5a68df9150563512.png

在实际开发中,经常遇到使用证书登录业务系统的需求。即用户登录系统前需要插入自己的USB Key证书,登录时输入Key的口令完成登录。其实前面那篇SSL文章已经介绍过,通过配置SSL客户端认证,就可以实现上述需求。但由于SSL本身的一些限制,很多场合下并不适用,因此仍需要在应用层实现证书登录过程。当然,证书登录的密码学原理与SSL一致,也就是可以理解成将SSL的流程在应用层实现一遍。因此应用系统实现证书登录,从数据库到客户端,需要以下几个步骤:

首先是在应用系统的数据库用户表中加入证书字段。这个字段数据类型一般是字符串类型,存储了用户注册时登记的个人证书(只含有公钥)的Base64数据。一般只需要一个字段,但如果需支持多证书登录,则可能要设置多个字段。相应的在用户管理功能里,需要加上对用户证书的管理,包括新增、修改及删除等。

其次是在应用系统的服务端实现对证书验证的支持。参考SSL的客户端验证流程,服务端需要对客户端发过来的签名进行验证。数字签名的验证过程不用多说,这里具体介绍讲几个要注意的地方。

一是数字签名的原文。为防止重放攻击,客户端产生数字签名的原文应该由服务端和客户端通过某种约定产生。如果是使用随机数,则随机数应该由服务端产生并返回给客户端进行数字签名,服务端验证签名时使用自己保存的随机数备份。这一点很重要,如果服务端验证签名时用客户端发送过来的随机数作为明文,那这样的设计对防止重放攻击没有意义。这样的设计就要求客户端登录服务器前至少有一次通信,用于随机数的请求和传输,并且服务端需要保存客户端登录请求状态,以维护数字签名与对应的随机数原文。流程如下图:

1329d78a56e0bc9217d2cc411d09e2b0.png

如果应用系统是BS结构,可以通过Session维护客户端的登录请求状态。但如果应用是CS结构,或者采用完全无状态服务(如Web Services),则实现上述过程比较困难。这时可以采用客户端生成原文并发送给服务端的方式,但这个原文需要进行设计,如在随机数基础上增加一些业务场景信息。而服务端在验证签名前,也必须先验证原文是否合规有效,是否之前被使用过。以最大程度杜绝被重放攻击的可能,流程如下。

f9f5119d3d167ef5b4a5974c8b73a0e9.png

二是签名结果是否包含证书问题。数字签名结果有包含签名所使用证书和不包含两种情况。如果包含证书,则服务端可以直接验证签名,并通过证书在数据库用户表定位相应的用户;否则,客户端登录时还需要传递用户名或ID等标识信息,服务端凭借用户标识查询到用户证书,并进行验证。

三是服务端对签名验证的兼容性问题。如果客户端和服务端都使用同一套密码服务接口,如CryptoAPI或某第三方提供的SDK,那客户端签名在服务端是可以直接验证的。但很多情况下,客户端和服务端使用了不同的密码服务接口,比如客户端使用基于CryptoAPI的控件签名,服务端则是用Java库的密码接口验证。那这时需要进行兼容性设置或开发,比如扩展服务端Java验证方法,使得它可以识别验证客户端的签名。虽然这有一定的挑战性,但它是完全可以实现的,因为不同密码服务都支持PKCS7签名标准。而且从密码学本身讲,不会因为实现环境的不同而产生原理的差别。

最后就是在客户端实现数字签名了。这里用CryptoAPI或CAPICOM组件什么的生成数字签名即可。但在实际应用中,大部分业务系统是BS结构,也就是需要在网页上实现数字签名的生成,这就涉及到在网页上使用控件的老问题了。遇到此类问题,一般的选择就是使用ActiveX控件技术。大家都知道,ActiveX并不是W3C的技术标准,而只是微软的自留地。如果使用了ActiveX控件,那就只能使用IE或IE内核模式的浏览器了(PS:对ActiveX的支持也就是IE的性能总是落后于其他浏览器的主要原因)。但由于HTML5的流行及其他一些因素,现在的业务趋势是Chrome浏览器已成为标配,大部分用户要求BS应用支持Chrome/Firefox等非IE浏览器。这种情况下无法使用ActiveX控件。虽然Chrome有自己的插件标准NPAPI和PPAPI,但由于安全原因,NPAPI已被谷歌放弃,在Chrome 42以上版本已经不再支持NPAPI插件。而对于PPAPI,个人认为开发还是比较复杂,涉及到的安全限制较多,目前不建议使用此技术开发插件。根据自己的开发经验,这里推荐使用伪协议和Socket服务监听的方式解决此问题。因为这已经不是这篇文章的主题,故不在此展开。对此有兴趣的同学可以私信或在评论区交流。

数字签名生成后,客户端就可以将数据提交给服务端,应根据具体情况提交相应的数据,具体可参考下表。

5809e8d038e910f5d93b465013d9789f.png

至此,通过从数据库、中间层到客户端的开发,应用系统已支持证书登录了。这里面介绍的是基本的实现思路,并不是很难,在具体开发时可能有其他问题和需求要解决。大家有任何问题欢迎在评论区交流。



推荐阅读
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 如何使用代理服务器进行网页抓取?
    本文介绍了如何使用代理服务器进行网页抓取,并探讨了数据驱动对竞争优势的重要性。通过网页抓取,企业可以快速获取并分析大量与需求相关的数据,从而制定营销战略。同时,网页抓取还可以帮助电子商务公司在竞争对手的网站上下载数百页的有用数据,提高销售增长和毛利率。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
author-avatar
迷彩三角裤_625
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有