时间:2021-05-19
本文大纲
一、提出问题
二、数字签名
三、实现步骤
四、参考代码
五、后记
六、参考资料
一、提出问题
最近在做一个项目,需要对一个现成的产品的数据库进行操作,增加额外的功能。为此,需要对该产品对数据库有什么操作进行研究(至于怎么监控一个产品的操作会引发什么数据库操作,以后会详细解说)。本来已经对数据库的操作了如指掌的,无意中发现数据库表里的每条记录都会有这样一个字段:
这感觉不妙了,字段名叫signature,顾名思义,就是签名的意思呀。难道数据库表中的每条记录都会有签名?也就是说如果我不能正确生成签名,而直接改记录中的字段,会被程序认为非法篡改了数据?那以后我的产品设计,是否也可采用这种方式来对每条记录做签名,防止数据被非法篡改,例如日志表中的数据?抱着这一发现以及这一连串的问题,我进行了以下的研究。在这里我将研究整理了一下,分享给大家。
二、数字签名
要解决上面的问题,首先就要对最基础的知识进行了解。这里最基础的知识,无疑就是什么是数字签名了。很多同学可能对这个名词并不陌生,但估计大多数人都是对其一知半解,会把散列、非对称加密、数字签名、数字证书的几个概念混为一谈,造成混乱。所以我先对相关概念进行解释,再往下讲。如果很熟悉这方面的同学可以跳过此部分,但对于绝大多数同学来说,不建议这样做。基础没搭好,直接看怎么实现,换了个说法又不知道怎么去做了。要想提高个人能力,做到举一反三很重要。
言归正传,先对跟数字签名有关的密码学知识简单说一下。加密方法分两大类,分别是单钥加密和双钥加密,数字签名涉及到双钥加密。关于双钥加密,主要涉及到以下几个要点[1]:
数字签名,顾名思义,就类似于一种写在纸上的普通的物理签名,不同的是,数字签名是电子信息化的,采用双钥加密的技术实现,是一种用于鉴别数字信息的方法。处理的过程,简单说就是将文件内容进行hash散列,信息发送者对散列后的字符串使用私钥加密,得到的最终字符串就是签名。然后将得到的签名字符串添加到文件信息的后面一同发送出去。接收者获取到文件信息和签名后,使用公钥对签名进行解密,就得到文件内容加密后的hash散列。此时,他可以对获取到的文件内容做hash散列,与签名中的hash散列进行匹对,从而鉴别出最终获取信息的真伪。主要过程如这四幅图所示[2]:
对文件内容进行hash散列,生成摘要
对生成的摘要,使用私钥进行加密,形成签名
将得到的签名,附到文件内容后部,就想到与签名签到文件尾部那样子
使用公钥对签名进行解密,得到摘要,并与获取到的文件内容生成的摘要做对比,以确定是否被篡改
想了解更详细的数字证书相关内容,可以访问此地址:http://.hzj.security.KeyPairUtil;public class Program { public static void main(String[] args) { // 1.生成证书// File file = new File("ca.key");// try {// FileOutputStream fileOutputStream = new FileOutputStream(file);// KeyPairUtil.initAndStoreKeyPair(fileOutputStream);// } catch (FileNotFoundException | NoSuchAlgorithmException e) {// e.printStackTrace();// } // 2.生成数字签名// DataSecurity dataSecurity = new DataSecurity();// String sign = dataSecurity.sign("大家好");// System.out.println("sign:" + sign); //3.验证数字签名 DataSecurity dataSecurity = new DataSecurity(); boolean result = dataSecurity.verifySign("大家好", "MCwCFCDs3sBw/fXK9flndl0M5lAUiPYFAhR9vyNNc91UiUBxFwK3GzLLjWgTkQ=="); System.out.println("result:" + result); }}
这里需要注意的是,为什么要对数字签名进行进行Base64编码呢?这是因为生成的数字签名是byte[]型的,无论对应哪一种字符集来转化成String,都会有乱码出现。所以,采用Base64进行编码,就可以得到一串可见的字符串,方便存储和重新调用。
五、后记
写到这里,本文的内容就基本上完结了。有人看到这里就会问,这不是说数据库记录防篡改嘛,一直都在讲数字签名,究竟怎么个防篡改?前文已经对数字签名的一些基本原理,使用的场景,开发的步骤、代码等进行了描述,开篇是也描述了项目中遇到的数据库中的问题。将这些信息综合起来,应该就知道怎么将数字签名应用到数据库记录中来作为数据库防篡改的工具了。知道工具怎么用是基础,会用工具来完成自己想做的事情,就是进阶了。祝你步步高升!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在Win8操作系统下,驱动数字签名是指运用在驱动上的数字签名,有数字签名的驱动操作系统会认为它是安全,稳定,有版权的驱动。如果驱动程序没有数字签名是无法成功
你知道word数字签名有什么用?你会利用word数字签名保护文档吗?今天小编就来讲讲有关word数字签名的内容。一、什么是“数字签名”我
Java数据库之插入记录插入数据表记录有3种方案一.使用Statement对象实现插入数据表记录的SQL语句的语法是:insertinto表名(字段名1,字段名
数字签名错误的原因是数字证书可能超过有效期了,数字证书有效期5年,到期后您需要办理证书换发手续才能继续使用。 数字签名(又称公钥数字签名、电子签章)是一种类似
本文实例讲述了Java实现JSP使用Servelt连接Oracle数据库的方法。为了实现在Servlet中连接数据库,必须编写Servlet的类程序。将Serv