一、增加hash值
(1)定义Block类,保存区块信息。
// 区块
public class Block {
private int id; // 区块ID
private String content; // 区块数据
private String hash; // 区块哈希
public Block() {}
public Block(int id, String content, String hash) {
this.id = id;
this.content = content;
this.hash = hash;
}
省略setter和getter方法....
}
(2)修改NoteBook类。
第一步:把List集合的数据类型修改为Block。
// 保存区块的集合
//private List<String> blocks = new ArrayList<>();
private List<Block> blocks = new ArrayList<>();
第二步:修改addGenesisBlock和addBlock方法。
//blocks.add(data);
blocks.add(new Block(
blocks.size() + 1,
data,
HashUtils.sha256(data)
));
第三步:修改showList方法的返回值。
//public List<String> showList() {
public List<Block> showList() {
return blocks;
}
第四步:修改NoteBook构造函数。
//JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, String.class);
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, Block.class);
(3)导入utils工具。
第一步:下载压缩文件并解压缩。
下载地址:https://pan.baidu.com/s/1Pe0IyTomPiSLKLuq9-zXDA 提取码:3grn
第二步:拷贝HashUtils.java和RSAUtils.java文件到项目的utils包下。
第三步:在build.gradle文件的dependencies节点中添加以下配置信息。
// https://mvnrepository.com/artifact/commons-io/commons-io
compile group: 'commons-io', name: 'commons-io', version: '2.5'
(4)修改前台页面,使用表格显示集合数据。
第一步:定义表格。
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>内容</th>
<th>哈希值</th>
</tr>
</thead>
<tbody id="tbody"></tbody>
</table>
第二步:修改showList函数,遍历集合数据,然后拼接成表格行。
// 展示结果
//$("#result").html(data);
for (var i = 0; i < data.length; i++) {
var block = data[i];
var id = block.id;
var content = block.content;
var hash = block.hash;
$("#tbody").append("<tr><th >" + id + "</th><td>" + content + "</td><td>" + hash + "</td></tr>")
}
二、校验哈希值
(1)修改页面
第一步:把“显示数据”按钮改为“校验数据按钮”,并指定事件。
<!--<button type="button" class="btn btn-default" onclick="showList()">显示数据</button>-->
<button type="button" class="btn btn-default" onclick="check()">校验数据</button>
第二步:定义check函数。
function check() {
loading.baosight.showPageLoadingMsg(false) // 显示进度条
// 发起请求
$.get("check", function (data) {
// 展示操作结果
$("#result").html(data)
// 隐藏进度条
loading.baosight.hidePageLoadingMsg();
})
}
(2)修改BlockController,添加check处理函数。
// 校验数据
@RequestMapping(value = "/check", method = RequestMethod.GET)
public String check() {
NoteBook noteBook = new NoteBook();
String result = noteBook.check();
if (StringUtils.isEmpty(result)) {
return "数据是安全的";
}
return result;
}
校验规则:把List集合中的每一个Block区块取出来,通过content字段生成一个哈希,然后再使用该哈希与它存储的hash字段的值进行比较。如果它们是一样的,代表数据没有被篡改。否则代表数据有问题。
(3)修改NoteBook,定义一个check方法。
// 校验数据
public String check() {
StringBuilder sb = new StringBuilder();
// 校验hash
for (Block block : blocks) {
String hash = block.getHash();
String tempHash = HashUtils.sha256(block.getContent());
if (!tempHash.equals(hash)) {
sb.append("编号为" + block.getId() + "的区块哈希有问题,请检查...<br>");
}
}
return sb.toString();
}
(4)运行程序测试代码。