用数字签名实现防篡改
通过数字签名来避免篡改的。一般思路如下:
1.将信息生成数字签名,并将数字签名用公私加密
2.用私钥解密数字签名,然后将信息再生成一次签名,将两个签名作比较得出结论
以下用JAVA模拟过程:首先生成一个公钥一个私钥,分别保存文件为 public.key和private.key;任给一个信息文件 demo.txt,用private.key生成数字签名(已加密),将签名存放于文件sign.sgn;用公私 public.key 验证数字签名。
签名算法选用DSA
注:本例仅对小数据可行,大数据会出现内存溢出。
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; public class P14_Key_Gener { //存放公钥 private String public_file = "D://public.key"; //存放私钥 private String private_file = "D://private.key"; //原始数据 private String indata = "D://demo.txt"; //数字签名文件 private String sign_file = "D://sign.sgn"; //签名算法 private String signatureAlgorithm = "DSA"; public static void main(String args[]) throws Exception { P14_Key_Gener pp = new P14_Key_Gener(); //第一步:创建公私钥文件 pp.createKey(); //第二步:用私钥对原始数据签名 pp.signGen(); //第三步:利用公私验证数字签名 pp.verify(); } /** * 生成一个公钥一个私钥,分别保存为文件public.key和private.key * @throws Exception */ public void createKey() throws Exception{ //定义public.key文件 FileOutputStream fos_public = new FileOutputStream(public_file); ObjectOutputStream oos_public = new ObjectOutputStream(fos_public); //定义private.key文件 FileOutputStream fos_private = new FileOutputStream(private_file); ObjectOutputStream oos_private = new ObjectOutputStream(fos_private); //形成DSA公私对 KeyPairGenerator keyGen = KeyPairGenerator.getInstance(signatureAlgorithm); keyGen.initialize(1024); //生成公钥和私钥对 KeyPair key = keyGen.generateKeyPair(); PublicKey publicKey = key.getPublic(); PrivateKey privateKey = key.getPrivate(); //写入文件 oos_public.writeObject(publicKey); oos_private.writeObject(privateKey); fos_public.close(); oos_public.close(); fos_private.close(); oos_private.close(); System.out.println("公私钥文件生成成功"); } /** * 对信息文件用private.key生成数字签名,将签名存放于signature.sgn * @throws Exception */ public void signGen() throws Exception{ File file_info = new File(indata); FileInputStream fis_info = new FileInputStream(file_info); int file_input_length = (int)file_info.length(); byte[] infoBytes = new byte[file_input_length]; fis_info.read(infoBytes); fis_info.close(); //读入私钥 FileInputStream fis_private = new FileInputStream(private_file); ObjectInputStream ois_private = new ObjectInputStream(fis_private); PrivateKey privateKey = (PrivateKey)ois_private.readObject(); ois_private.close(); fis_private.close(); //生成签名 Signature sig = Signature.getInstance(signatureAlgorithm); //用私钥初始化数字签名对象 sig.initSign(privateKey); //对数据实施签名 sig.update(infoBytes); //完成签名,将结果放入字节数组 byte[] signatureBytes = sig.sign(); //将签名写入文件sign.sgn FileOutputStream os_signature = new FileOutputStream(sign_file); os_signature.write(signatureBytes); os_signature.close(); System.out.println("签名文件生成成功"); } /** * 用公私验证数字签名 * @throws Exception */ public void verify() throws Exception{ //读取原文数据 File file_info = new File(indata); FileInputStream fis_info = new FileInputStream(file_info); int fileinfolength = (int)file_info.length(); byte[] fileBytes = new byte[fileinfolength]; fis_info.read(fileBytes); fis_info.close(); //读入公钥 FileInputStream fis_public = new FileInputStream(public_file); ObjectInputStream oos_public = new ObjectInputStream(fis_public); PublicKey publicKey = (PublicKey)oos_public.readObject(); fis_public.close(); oos_public.close(); //读入签名文件 File file_sign = new File(sign_file); FileInputStream fis_sig = new FileInputStream(file_sign); int sign_length = (int)file_sign.length(); byte[] signBytes = new byte[sign_length]; fis_sig.read(signBytes); fis_sig.close(); //使用公私验证 Signature sig = Signature.getInstance(signatureAlgorithm); sig.initVerify(publicKey); //对msgBytes重新实施签名 sig.update(fileBytes); if(sig.verify(signBytes)) { System.out.println("文件没有被篡改"); }else{ System.out.println("文件被篡改"); } } }
用数字签名实现防篡改相关推荐
- 对称加密、非对称加密、DES、AES、RSA、OpenSSL、数字签名、防篡改
本公众号分享的所有技术仅用于学习交流,请勿用于其他非法活动,如果错漏,欢迎留言指正 <加密与解密>第4版 加解密 安全领域的重要分支和基础设施 互联网重要数据的传输需要加解密 TCP/IP ...
- 目前基于区块链的档案防篡改系统的设计如何实现防篡改
架构设计图 分析 为了保障档案数据的安全性和隐私性,存储档案附件和档案属性存储加密存储在私有IPFS集群,档案的IPFS地址和数字指纹存储在私有区块链上.公有区块链定期存储和检查私有区块链最新不可逆区 ...
- 一篇文章带你看懂以及实现加解密技术中的信息防篡改、一码一检、过期失效、多种实现方式
一篇文章带你看懂以及实现加解密技术中的信息防篡改.一码一检.过期失效.多实现方式 导语 一.简介 二.代码功能介绍以及源码 2.1.AbstractRsa 类 2.2 RsaUtils 类 2.3 R ...
- 网路游侠:用防篡改和WAF保护网站安全
前几天也给大家说过WEB应用防火墙,包括软件的和硬件的,今天网路游侠再给大家推荐个产品,当然这个是二合一的,就是:网页防篡改+WEB应用防火墙.比较有特色,好了,废话不说,正文开始: 安装就跳过了,相 ...
- UnisGuard防篡改产品了解
1 UnisGuard采用基于文件驱动级的保护技术--内核事件触发保护机制,确保系统资源不被浪费.不同于其他防篡改软件的Web事件触发机制,UnisGuard的页面防篡改模块采用的是与操作系统底层文件 ...
- php重放,Api 接口安全-防篡改,防重放理解总结
防篡改 为什么要防篡改 http 是一种无状态的协议, 服务端并不知道客户端发送的请求是否合法, 也并不知道请求中的参数是否正确 举个栗子, 现在有个充值的接口, 调用给用户对应的余额 http:// ...
- 江翰网页防篡改系统解决方案--前言
前言 在电子商务.电子政务日益普及的今天,网站已成为企事业单位.政府机关的形象窗口,也是对外开展业务.提供服务的重要手段.网站页面被篡改,不仅将影响正常业务的开展,而且对企业形象.政府信誉带来极其不好 ...
- 怎样用CDN防篡改、抗攻击、控内容?一份CDN安全指南请查收
5大安全产品全面升级,抢先了解:https://developer.aliyun.com/topic/securityapril 预约观看发布会:https://yq.aliyun.com/live/ ...
- 区块如何防篡改_深入浅出:一条数据是如何完成上链的
一笔业务数据在区块链处理的流程大致分为三个阶段:分别是上链前处理阶段.链上处理阶段和智能合约处理阶段. 一.上链前处理阶段 业务数据上链前需要将业务数据处理,并且对信息进行签名.这些过程可以通过对应的 ...
最新文章
- 怎么可以查到AD里面长时间没有登录的帐号
- Python算法实战系列:栈
- Asp.net(C#)-彩色图片转化为黑白
- 【温故知新】CSS学习笔记(三大特性)
- This version of MySQL doesn't yet support 'LIMIT IN/ALL/ANY/SOME subquery 解决方法
- 开发者中的领导与管理(译文)
- 清北学堂2018年1月省选强化班模拟考试1
- JavaScript高级程序设计4.pdf
- OpenProj: The OpenSource Solution for Managing Your Projects
- 80核处理器_【装机帮扶站】第338期:95元的6核心12线程处理器
- 盘点 6 个开源的音乐播放器!
- 编程题(买帽子求第三便宜价格)
- WordPress完美删除页脚自豪地采用WordPress和Proudly powered by WordPress(页尾footer.php)
- 单链表操作之合并两个单链表
- 解决:steps/make_fbank.sh: line 132: run.pl: command not found
- 安装Linux Mint 17后要做的20件事
- 渗透信息收集 子域名查询
- python 病毒 文件复制_python病毒
- 如何避免网站改版造成的排名影响
- 一体化计算机接口,4.机电一体化计算机接口设计(下).ppt