使用WebCrypto API的电子签名

有时我们需要让用户进行电子签名。 通常,人们会理解为将您的手写签名以某种方式放在屏幕上。 根据管辖范围,可能很好,或者仅存储图像可能还不够。 例如,在欧洲,有910/2014号法规 ,该法规定义了什么是电子签名。 从法律文本可以预期到,该定义相当模糊:

“电子签名”是指电子形式的数据,该数据附加到电子形式的其他数据上或与之逻辑关联,并由签字人用来签名;

是的,再读几次,再说几次“ wat”,让我们讨论一下这是什么意思。 它基本上可以表示任何东西。 仅将绘制的签名的图像(例如使用html画布)附加到数据上并且仍然可以计数,这在技术上是可以接受的。

但是,当我们使用更具体的电子签名类型-高级和合格的电子签名时,情况会好一些:

高级电子签名应满足以下要求:
(a)它与签字人有独特的联系;
(b)有能力识别签字人; (c)使用电子签名创建数据创建的,签名者可以在其唯一的控制下以高度的信心使用该签名; 和 (d)它以这种方式链接到与其签名的数据,以便可以检测到该数据的任何后续更改。

从技术意义上讲,这看起来像是正确的“数字签名”,例如,使用私钥进行签名,并使用公共密钥来验证签名。 “合格”签名需要由合格的提供者发出,该提供者基本上是一个受信任的证书颁发机构。 必须在安全设备(智能卡和HSM)上发布用于放置合格签名的密钥,以便除所有者外,其他任何人都不能访问私钥。

但是,高级签名和合格签名之间的法律区别尚不完全清楚–该法规明确指出,非合格签名也具有法律价值。 在浏览器中使用合格的签名(带有智能卡)会给用户带来可怕的体验-在大多数情况下,它会通过Java Applet进行,而Java Applet仅可在Internet Explorer和当今的特殊Firefox版本上运行。 替代方案包括处理签名的桌面软件和本地服务JWS应用程序,但是智能卡目前是一个大问题,而且话题不多。

那么,我们如何允许用户“放置”电子签名? 我有一个想法,那就是可以完全使用WebCrypto API来完成此工作,如今,WebCrypto API在浏览器中或多或少地得到了支持。 这个想法如下:

  • 让用户输入密码以作弊
  • 从密码中获取密钥(例如,使用PBKDF2)
  • 使用派生密钥在用户提交的表单内容上签名
  • 将签名与其余表单数据一起存储
  • (可选)存储派生密钥以进行验证

这是实现该流程的javascript要点 。

许多片段来自非常有用的webcrypto示例存储库 。 hex2buf,buf2hex和str2ab函数是实用程序(可惜在js中不是标准的)。

即使有点冗长,代码的作用也很简单。 所有操作都使用Promise和“ then”链接在一起,说实话,这对编写和阅读非常繁琐(但我想不可避免):

  • 密码作为原始密钥加载(转换为数组缓冲区后)
  • 使用PBKDF2导出一个秘密密钥(具有100次迭代)
  • 密钥用于对用户填写的内容进行HMAC“签名”
  • 签名和密钥被存储(在此示例中的UI中)
  • 然后可以使用以下数据验证签名:数据,签名和密钥

您可以在这里进行测试:

存储签名应足以满足“电子签名”的定义。 这是只有用户知道的秘密密码,甚至可能意味着这是“高级电子签名”。 存储派生的秘密密钥是有问题的–如果存储它,则意味着您可以代表用户“伪造”签名。 但是,不存储它意味着您无法验证签名-只有用户可以。 根据用例,您可以选择其中一个。

现在,我不得不承认我尝试从密码(RSA和ECDSA)派生非对称密钥对。 WebCrypto API不允许开箱即用。 因此,我尝试使用deriveBits()“生成”密钥,例如,为RSA设置“ n”和“ d”值,为ECDSA设置x,y和d值( 可以在稍作搜索后在此处找到) 。 但是我失败了–您不能仅将任何值指定为importKey参数,并且约束条件未记录在任何地方,除了底层算法细节外,这超出了我的实验范围。

目的是,如果我们仅从密码中获取私钥,就可以轻松地从私钥中获取公钥(反之则不然)–然后我们存储公钥以进行验证,而私钥仍然是真正的私钥,这样我们就不能伪造签名。

我必须在此处添加免责声明,因为我意识到这不是很安全。 首先,在许多情况下从密码派生密钥是有问题的。 但是,在这种情况下(放置签名),可以。

附带说明–使用WebCrypto API十分繁琐。 也许是因为还没有人真正使用过它,所以搜索错误基本上为您提供了Chromium的源代码,而没有其他任何东西。 感觉就像是一个未知的领域(尽管文档和示例足以使您入门)。

我不知道以这种方式进行电子签名是否有用。 我将其实现为一个实际有意义的用例(参与方成员资格声明签名)。 它是否比画布上的手绘签名更好–我认为是这样(除非您从图像中得出密钥,否则,由于较高的熵,手写的密钥会更好)。

翻译自: https://www.javacodegeeks.com/2017/06/electronic-signature-using-webcrypto-api.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mycat mysql 物理部署_一、MyCat的搭建

一、什么是mycat简单直接点就是,MyCat其实就是一个数据库的中间件!一般我们都是app直接到数据库!有了MyCat以后,就是app到MyCat然后再访问数据库。mycat是个中间件,它负责连接管理mysql,应用程序连接mycat,把mycat当作…

java 记事本换行_[求助]记事本自动换行

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我编的一个记事本 自动换行该如何实现import java.io.*;import java.awt.*;import java.awt.event.*;import java.awt.print.*;public class Jishiben extends Frame implements ActionListener{FileDialog fileDlg;String str, f…

JAVA中的适配器应用_Java适配器模式应用之电源适配器功能详解

本文实例讲述了Java适配器模式应用之电源适配器功能。分享给大家供大家参考,具体如下:一、模式定义存在两种适配器模式1 对象适配器模式,在这种适配器模式中,适配器容纳一个它包裹的类对象的物理实体。2 类适配器模式,…

java.util接口_函数接口– Java 8中java.util.function包中的函数接口

java.util接口我以前写过有关功能接口及其用法的文章。 如果您正在探索要成为Java 8一部分的API,尤其是那些支持lambda表达式的API,您会发现很少的接口,例如Function,Supplier,Consumer,Predicate和其他接口…

java new string作用_java中直接new String对象?

首先明确一点,在Java中比较的是两个对象的地址,equals()比较的是两个对象的值,如果使用equals()来替换,则两个输出结果都为true。言归正传,为什么第一个返回为false?先看一下intern()这个方法的描述&#x…

Apache Camel中的短重试与长重试

《骆驼设计模式》一书介绍了20种模式以及用于设计基于Apache Camel的集成解决方案的众多技巧和最佳实践。 每个模式都基于真实的用例,并提供了Camel特定的实现细节和最佳实践。 为了让您有这本书的感觉,以下是该书的重试模式摘录,其中介绍了如…

java注解的继承_Java注解合并,注解继承

spring中有时候一个类上面标记很多注解。实际上Java注解可以进行继承(也就是把多个注解合并成1个)比如说SpringMVC的注解RestControllerRequestMapping("/person")可以合并为一个PathRestController("/user")实现是:import java.lang.annotatio…

java实现驾校考试系统_jsp驾校考试系统

本驾校考试系统采用了Browser/Server体系结构,JSP(Java Server Page)作为前台开发工具,MySQL作为后台数据库进行开发。最终系统实现的系统将分为管理员和学员两个角色,其中系统管理员部分的主要功能包括修改登录密码、学员信息管理、科目1题目…

Java Maven和Gradle构建的主题缓存

Concourse CI 3.3.x引入了在任务运行之间缓存路径的功能。 此功能有助于加快将内容缓存在特定文件夹中的任务-在这里,我将演示如何使用此功能来加快基于Maven和Gradle的Java构建。 我在这篇文章中使用的代码和管道可以在我的github仓库中找到 – https://github.co…

java qlv转mp4 代码_怎么将qlv格式转换成mp4?教你快速转换视频格式的技巧

如何将qlv格式转换成mp4?众所周知qlv格式是腾讯视频的下载格式,而qlv格式的特点在于不能用别的播放器打开。如果用腾讯视频以外的播放器打开则需要将qlv格式转换成mp4,那你知道将qlv格式转换成mp4的技巧吗?下面小编教你一种转换qlv格式的技巧…

mysql导入竖杠分割的数据_MYSQL :逗号分隔串表,分解成竖表

DROP TEMPORARY TABLE IF EXISTS Temp_Num ;CREATE TEMPORARY TABLE Temp_Num ( xh INT PRIMARY KEY ); -- 创建数字辅助表SET i 0;INSERT INTO Temp_Num(xh) -- 写入数字辅助表SELECT i : i1FROM AdDataCenter.Ad_Targeting_Mobisage aLIMIT 0, 100 ;SELECT b.AdGroupID , SU…

maven 父maven_Maven的春天

maven 父maven1.概述 本教程将讨论如何使用Maven设置Spring,并介绍使用Spring依赖项的特定用例。 最新的Spring版本可以在Maven Central中找到。 2.基本的Maven Spring依赖关系 Spring的设计具有模块化和灵活性–基本的Spring容器可用于多种情况,而无需…

java中cell无法输出_java – iText 5.5.3 PDFPCell:长文本不适合单元格(不正确地包装文本)...

我正在尝试创建一个包含表格的波斯语PDF,我想写入它.当我的字符串很长时,它不能正确地适合单元格.感觉像字符串填充单元格颠倒!…我的意思是,例如,当我想写“你好我的朋友.什么事情?”在单元格中输出如下:|这是怎么回事? ||我的朋…

emc存储java打开后报错_连接EMC存储系统 - osc_mk8rqvg4的个人空间 - OSCHINA - 中文开源技术交流社区...

1.准备一台笔记本电脑,一根网线即可。2.将网线一头连接笔记本电脑,另一头连接存储。(连接存储的一头应连接到有扳手图标的那一网口上)3.配置IP地址IP:128.221.1.254子网掩码:255.255.255.04.ping 128.221.1.250看是否能ping通&…

浙大JAVA实验题12_2019浙大计算机考研机试模拟赛(2)——概念专题

题目链接 引用自晴神OJA - 边覆盖B - 极大独立集C - 稳定婚姻问题D - 笛卡尔树没赶得上全程的比赛,就做了两道,后面两道以后有时间再补。两道都是概念题,比较基础~ 以下是题解A - 边覆盖Case Time Limit: 200 MS (Others) / 400 MS (Java) …

hadoop小型集群_小型Hadoop集群的Ganglia配置和一些故障排除

hadoop小型集群Ganglia是一个针对大型集群的开源,可扩展且分布式的监视系统。 它收集,汇总并提供数十种与计算机相关的指标(例如CPU,内存,存储,网络使用情况)的时序视图。 您可以在UC Berkeley …

java 异常堆栈日志分析_Java 进阶之路:深入解读 Java 异常堆栈丢失原因

在应用程序的开发和维护中,通常需要借助运行日志来监控和定位问题。其中,在日志中打印异常堆栈信息对于定位问题极为重要,因此,作为一名工程师,对打印异常堆栈应该不陌生。笔者在实践中曾遇到一个奇怪的现象: Java 应用…

使用Spock Mocks进行Grails 3.3集成测试

在Grails单元测试中,可以轻松使用Grails随附的Spock框架来模拟或存根协作者(例如服务)。 “ 测试”一章对模拟协作者, doWithSpring / doWithConfig回调方法,在测试中模拟bean的FreshRuntime批注进行了一些解释&#…

PHP ERROR_PHP 处理错误函数

错误级别Fatal Error:致命错误(脚本终止运行)E_ERROR //致命的运行错误,错误无法恢复,暂停执行脚本E_CORE_ERROR //PHP启动时初始化过程中的致命错误E_COMPILE_ERROR //编译时致命性错,就像由Zend脚本引擎生成了一个E_ERRORE_USER_ERROR //自…

php接收文件,如何通过php 发送与接收流文件

php 发送与接收流文件sendStreamFile.php 把文件以流的形式发送receiveStreamFile.php 接收流文件并保存到本地sendStreamFile.php<?php /** php 发送流文件* param String $url 接收的路径* param String $file 要发送的文件* return boolean*/function sendStreamFile($u…