区块链的原理与应用? -1

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 读完了 <区块链 领导干部读本> , 以及看了一部分<区块链原理,设计与应用>, 通过对区块链的一些了解跟随网络博客完成demo创建区块链 区块链就是一串或者是一系列区块的集合,类似于链表的概念,每个区块都指向于后面一个区块,然后顺序的连接在一起.

读完了 <区块链 领导干部读本> , 以及看了一部分<区块链原理,设计与应用>,
通过对区块链的一些了解跟随网络博客完成demo

创建区块链
区块链就是一串或者是一系列区块的集合,类似于链表的概念,每个区块都指向于后面一个区块,然后顺序的连接在一起. 那么每个区块中内容是? 区块链中的每一个区块都存放了很多有价值的信息, 只要包括3个部分 : 自己的数字签名, 上一个区块的数字签名, 还有一切需要加密的数据 ( 这些数据在比特币中就相当于是交易的信息,它是加密货币的本质). 每个数字签名不但证明了自己是特有的一个区块, 而且指向了前一个区块的来源,让所有的区块在链条中可以串起来,而数据就是一些特定的信息, 你可以按照业务逻辑来保存业务数据.

block

这里的hash指的就是数字签名
所以每一个区块不仅包含前一个区块的hash值, 同时包含自身的一个hash值, 自身的hash值是通过之前的hash值和数据data通过hash计算出来的. 如果前一个区块的数据一旦被篡改了, 那么前一个区块的hash值也会同样发生变化 (因为数据也被计算在内) ,这样也就导致了所有后续的区块中的hash值, 所以计算和对比hash值会让我们检查到当前的区块链是否是有效的, 也就避免了数据被恶意篡改的可能性, 因为篡改数据就会改变hash值并破坏整个区块链.

定义区块链的类Block:

package com.sha256.sha256.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

Data
@NoArgsConstructor
@AllArgsConstructor
public class Block {

    private String hash; // our signature
    private String previousHash; // the hash of previous block
    private String data; //our data will be a simple message.
    private long timeStamp; //as number of milliseconds since 1/1/1970.

    //Block Constructor
    public Block(String data,String previousHash){
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = new Date().getTime();
    }
}

String hash是我们的数字签名, 变量previousHash保存前一个区块的hash值, String data是保存我们区块的数据(比如交易转账信息).

创建数字签名

熟悉加密算法的朋友,Java方式可以实现的加密方式很多, 例如BASE, MD, RSA ,SHA 等等, 我在这里选用了SHA256这种加密方式, SHA ( Secure Hash Algorithm ) 安全散列算法, 这种算法的特点是数据的少量更改会在Hash值中产生不可预知的大量更改, hash值用作表示大量数据的固定大小的唯一值, 而SHA256算法的hash值大小为256位. 之所以选用SHA256是因为它的大小正合适, 一方面产生重复hash值的可能性很小, 另一方面在区块链实际应用过程中, 有可能会产生大量的区块, 而使得信息量很大, 那么256位的大小就比较恰当了.

密码学与安全技术

节选<区块链原理,设计与应用>
测试SHA256加密:

package com.sha256.sha256.test;

import com.sha256.sha256.utils.SHA256Util;

public class TestSHA256 {

    public static void main(String[] args) {
        String message0 = "我是要被加密的信息";
        String message1 = "我是要被加密的信息";
        String message2 = "我是要被加密的信息.";
        String encryptionMessage0 = SHA256Util.applySha256(message0);
        String encryptionMessage1 = SHA256Util.applySha256(message1);
        String encryptionMessage2 = SHA256Util.applySha256(message2);
        System.out.println(encryptionMessage0);
        System.out.println(encryptionMessage1);
        System.out.println(encryptionMessage2);
    }
}

输出:
2d7641299aba44f11e8b567dc55f9a45c5218e20bdb65d1306020bfb09fe2f31
2d7641299aba44f11e8b567dc55f9a45c5218e20bdb65d1306020bfb09fe2f31
2a6588b9fd3b412176b4cf499c23f1aa06b35843e6082ca0ab2227f4129bc805
Hash算法与数字摘要:
Hash定义:
Hash(哈希或散列)算法是非常基础也非常重要的计算机算法,它能将任意长度的二进制明文串映射为较短的(通常是固定长度的)二进制串(Hash值), 并且不同的明文很难映射为相同的Hash值.

这意味着对于某个文件,无需查看其内容,只要其SHA-256 Hash计算后结果同样为:
2d7641299aba44f11e8b567dc55f9a45c5218e20bdb65d1306020bfb09fe2f31,
则说明文件内容极大概率上就是 –> 我是要被加密的信息 几个字.

Hash值在应用中又常被称为指纹(fingerprint)或摘要(digest). Hash算法的核心思想也经常被应用到基于内容的编址或命名算法中.

一个优秀的Hash算法将能实现如下功能:

正向快速 : 给定明文和Hash算法, 在有限时间和有限资源内能计算得到Hash值.
逆向困难 : 给定(若干)Hash值, 在有限时间内很难(基本不可能)逆推出明文;
输入敏感 : 原始输入信息发生任何改变,新产生的Hahs值都应该出现很大不同;(见上面的三个字符串的比较)
冲突避免 : 很难找到两端内容不同的明文,使得它们的Hash值一致(发生碰撞).
冲突避免有时候又称为”抗碰撞性”, 分为”弱抗碰撞性”和”强抗碰撞性”. 如果给定明文前提下, 无法找到与之碰撞的其他明文, 则算法具有”弱抗碰撞性”, 如果无法找到任意两个发生Hash碰撞的明文, 则称算法具有”强抗碰撞性”.

很多场景下,也往往要求算法对于任意长的输入内容,可以输入定长的Hash值结果.

常见算法

Hash算法和MD5等

加密安全

提示: MD5是一个经典的Hash算法,和SHA-1算法一起都被认为安全性已不足应用于商业场景.

调用工具类的SHA256算法:

package com.sha256.sha256.utils;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA256Util {
    //Applies SHA256 to a string and returns the result
    //SHA256 encryption
    public static String applySha256(String input){
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            //Applies sha256 to our input
            byte[] hash = digest.digest(input.getBytes("UTF-8"));
            //This will contain hash as hexidecimal
            StringBuffer hexString = new StringBuffer();
            for(int i=0;i<hash.length;i++){
                String hex = Integer.toHexString(0xff & hash[i]);
                if(hex.length()==1){
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
}

强化Block实体类:
对hash值进行赋值:

package com.sha256.sha256.bean;

import com.sha256.sha256.utils.SHA256Util;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Block {

    private String hash; // our signature
    private String previousHash; // the hash of previous block
    private String data; //our data will be a simple message.
    private long timeStamp; //as number of milliseconds since 1/1/1970.

    //Block Constructor
    public Block(String data,String previousHash){
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = new Date().getTime();
        this.hash = SHA256Util.calculateHash(this); //Making sure we do this after we set the other values.
    }
}

同时在工具类中:
加入新的方法 calculateHash:

package com.sha256.sha256.utils;

import com.sha256.sha256.bean.Block;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA256Util {
    //Applies SHA256 to a string and returns the result
    //SHA256 encryption
    public static String applySha256(String input){
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            //Applies sha256 to our input
            byte[] hash = digest.digest(input.getBytes("UTF-8"));
            //This will contain hash as hexidecimal
            StringBuffer hexString = new StringBuffer();
            for(int i=0;i<hash.length;i++){
                String hex = Integer.toHexString(0xff & hash[i]);
                if(hex.length()==1){
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }

    //calculate the hash use previoushash , timestamp , data
    public static String calculateHash(Block block){
        String calculateHash = SHA256Util.applySha256(block.getPreviousHash() + Long.toString(block.getTimeStamp()) + block.getData());
        return calculateHash;
    }

}

测试:

package com.sha256.sha256.test;

import com.sha256.sha256.bean.Block;
import com.sha256.sha256.utils.SHA256Util;

public class TestSHA256 {

    public static void main(String[] args) {
        //test1 测试三个被加密字符串 加密后的hash值的差别
        /**
         * 虽然第三条信息仅仅多一个".",但加密后的数据hash相差极大
         */
        String message0 = "我是要被加密的信息";
        String message1 = "我是要被加密的信息";
        String message2 = "我是要被加密的信息.";
        String encryptionMessage0 = SHA256Util.applySha256(message0);
        String encryptionMessage1 = SHA256Util.applySha256(message1);
        String encryptionMessage2 = SHA256Util.applySha256(message2);
        System.out.println(encryptionMessage0);
        System.out.println(encryptionMessage1);
        System.out.println(encryptionMessage2);

        //创建区块链逻辑, 因为第一个块没有上一个块的hash头部值,所以输入0 作为前一个块的previous hash
        /**
         * 由于在{@link SHA256Util#calculateHash(Block)}
         * 中对同时产生的new Date().getTime() (timestamp)
         * 也加入进行了hash加密,所以固有的message (data)及
         * previoushash之和进行了加密.
         */
        Block genesisBlock = new Block("这是第一个区块中的要被加密的信息和交易信息","0");
        String hash1 = genesisBlock.getHash();
        System.out.println("Hash for block 1 : "+hash1);

        Block secondBlock = new Block("这是第二个区块,以及其中信息!!!它的前区块头部hash我们拿上一个的来使用",hash1);
        String hash2 = secondBlock.getHash(); //
        System.out.println("Hash for block 2 : "+hash2);

        Block thirdBlock = new Block("这是第三个区块,它的hash应该已经被前两个的信息纳入进来了,它的hash如果对不上,那么说明前面的信息被改动过了",hash2);
        String hash3 = thirdBlock.getHash();
        System.out.println("Hash for block 3 : "+hash3);

    }
}

运行结果:

  • 由于在{@link SHA256Util#calculateHash(Block)}
  • 中对同时产生的new Date().getTime() (timestamp)
  • 也加入进行了hash加密,所以固有的message (data)及
  • previoushash之和进行了加密.

2d7641299aba44f11e8b567dc55f9a45c5218e20bdb65d1306020bfb09fe2f31
2d7641299aba44f11e8b567dc55f9a45c5218e20bdb65d1306020bfb09fe2f31
2a6588b9fd3b412176b4cf499c23f1aa06b35843e6082ca0ab2227f4129bc805
Hash for block 1 : cdb1bb85e8f2394f3cee57d82800f5413848fa6c981fefa0fd204497f853c8b4
Hash for block 2 : fad4bc33a9b9f5fc5053fe3583b6bf366be9ea518936ce37d58b916e2c4699be
Hash for block 3 : 558ff9aac60aea20da1936a78a863195cbe23748f08fa34219bb3abc66078b65
注意: 每次 Hash for block * 的产生的值是不同的,因为每次对timestamp进行了计算

每一个区块都必须要有自己的数据签名即hash值,这个hash值依赖于自身的信息(data)和上一个区块的数字签名(previousHash), 但这个还不是区块链, 下面让我们存储区块到数组中, 这里我会引入gson包, 目的是可以用json方式查看整个一条区块链结构.
看test3

package com.sha256.sha256.test;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.GsonBuilder;
import com.sha256.sha256.bean.Block;
import com.sha256.sha256.utils.SHA256Util;

import java.util.ArrayList;

public class TestSHA256 {

    //声明一个区块链,用于添加Block实体
    public static ArrayList<Block> blockChain = new ArrayList<>();

    public static void main(String[] args) {
        //test1 测试三个被加密字符串 加密后的hash值的差别
        /**
         * 虽然第三条信息仅仅多一个".",但加密后的数据hash相差极大
         */
        String message0 = "我是要被加密的信息";
        String message1 = "我是要被加密的信息";
        String message2 = "我是要被加密的信息.";
        String encryptionMessage0 = SHA256Util.applySha256(message0);
        String encryptionMessage1 = SHA256Util.applySha256(message1);
        String encryptionMessage2 = SHA256Util.applySha256(message2);
        System.out.println(encryptionMessage0);
        System.out.println(encryptionMessage1);
        System.out.println(encryptionMessage2);

        //test2 创建区块链逻辑, 因为第一个块没有上一个块的hash头部值,所以输入0 作为前一个块的previous hash
        /**
         * 由于在{@link SHA256Util#calculateHash(Block)}
         * 中对同时产生的new Date().getTime() (timestamp)
         * 也加入进行了hash加密,所以固有的message (data)及
         * previoushash之和进行了加密.
         */
        Block genesisBlock = new Block("这是第一个区块中的要被加密的信息和交易信息","0");
        String hash1 = genesisBlock.getHash();
        System.out.println("Hash for block 1 : "+hash1);

        Block secondBlock = new Block("这是第二个区块,以及其中信息!!!它的前区块头部hash我们拿上一个的来使用",hash1);
        String hash2 = secondBlock.getHash(); //
        System.out.println("Hash for block 2 : "+hash2);

        Block thirdBlock = new Block("这是第三个区块,它的hash应该已经被前两个的信息纳入进来了,它的hash如果对不上,那么说明前面的信息被改动过了",hash2);
        String hash3 = thirdBlock.getHash();
        System.out.println("Hash for block 3 : "+hash3);

        //test3 add our blocks to the blockchain ArrayList :
        blockChain.add(new Block("区块链上第一小节","0"));
        blockChain.add(new Block("区块链第二小节",blockChain.get(blockChain.size()-1).getHash()));
        blockChain.add(new Block("区块链第三小节",blockChain.get(blockChain.size()-1).getHash()));

//        JSONArray blockChainJson1 = (JSONArray)JSONArray.toJSON(blockChain); //JSONArray是不排版的
//        System.out.println(blockChainJson1);
        String blockChainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockChain);

        System.out.println(blockChainJson);
    }
}
相关文章
|
10天前
|
供应链 数据可视化 物联网
新技术趋势与应用:区块链、物联网与虚拟现实的融合与创新
本文深入探讨了当前最具变革性的新兴技术——区块链、物联网(IoT)和虚拟现实(VR)的发展趋势及其应用场景。通过分析这些技术的基本原理、独特优势以及实际用例,揭示了它们如何相互促进、融合创新,并共同塑造未来智能化世界的蓝图。文章旨在为读者提供对新技术趋势的全面理解,展现其在不同领域中的广泛应用前景,以及这些技术如何共同推动社会进步和产业升级。
|
19天前
|
供应链 安全 物联网
新技术趋势与应用:区块链、物联网和虚拟现实的未来发展
本文将探讨新兴技术如区块链、物联网和虚拟现实的发展趋势和应用场景。区块链技术作为一种分布式数据库,具有去中心化、安全透明等特点,被广泛应用于金融、供应链等领域。物联网技术通过将物品与互联网连接,实现智能化管理和控制,应用于智能家居、智能交通等场景。虚拟现实技术则通过模拟虚拟环境,提供沉浸式体验,应用于游戏、教育等领域。这些技术的发展将深刻影响我们的生活和社会。
31 2
|
10天前
|
传感器 物联网 区块链
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【10月更文挑战第7天】随着科技的飞速发展,新兴技术如区块链、物联网、虚拟现实等正在逐渐改变我们的生活。本文将对这些新兴技术的发展趋势和应用场景进行探讨,并结合代码示例,帮助读者更好地理解这些技术的应用价值和未来发展方向。
|
8天前
|
存储 传感器 物联网
未来已来:区块链技术在物联网与虚拟现实中的应用探索
【10月更文挑战第9天】随着技术的不断进步,区块链、物联网和虚拟现实等新兴技术正逐步渗透到我们的生活中。本文将探讨这些技术如何相互融合,共同推动社会的进步。我们将通过分析它们的发展趋势和应用场景,揭示它们在未来社会中的潜在价值。让我们一起思考如何利用这些技术创造一个更美好的世界。
|
14天前
|
供应链 物联网 区块链
新技术浪潮之巅:探索区块链、物联网与虚拟现实的未来应用图景
【10月更文挑战第3天】在技术日新月异的今天,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正逐步改变我们的工作和生活方式。本文将深入探讨这些技术的发展趋势,通过具体应用场景描绘它们在未来社会中的角色,旨在为读者提供一个关于如何利用这些技术推动创新和解决现实问题的视角。
|
14天前
|
传感器 物联网 新制造
新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【10月更文挑战第3天】随着科技的不断进步,新兴技术如区块链、物联网、虚拟现实等正在逐渐改变我们的生活。本文将探讨这些技术的发展趋势和应用场景,并分析它们如何影响我们的未来。
23 2
|
15天前
|
传感器 供应链 物联网
新技术趋势与应用:区块链、物联网与虚拟现实的未来展望
【10月更文挑战第2天】 在当今快速变化的技术世界中,新兴技术如区块链、物联网和虚拟现实正在重塑我们的生活、工作和娱乐方式。这些技术不仅带来了前所未有的便利和效率,还为各行各业提供了创新的解决方案。本文将探讨这三种技术的发展趋势和应用场景,并分析它们如何共同推动社会进步。通过深入分析,我们将看到这些技术如何在未来的数字经济中扮演关键角色。
25 3
|
10天前
|
供应链 监控 物联网
新技术趋势与应用:区块链、物联网与虚拟现实的融合与创新##
【10月更文挑战第7天】 本文探讨了区块链、物联网(IoT)和虚拟现实(VR)这三种新兴技术的发展趋势及其在不同领域的应用场景。通过对每种技术的分析,以及它们相互结合后的潜在影响,揭示了这些技术在未来可能带来的变革。 ##
16 0
|
11天前
|
供应链 安全 物联网
深入理解区块链技术的核心原理与应用前景
【10月更文挑战第6天】深入理解区块链技术的核心原理与应用前景
27 0
|
16天前
|
供应链 物联网 区块链
新技术趋势与应用:区块链、物联网与虚拟现实的未来
【10月更文挑战第1天】在21世纪的科技浪潮中,新兴技术正迅速改变着我们的生活、工作和娱乐方式。本文探讨了三种引人注目的技术趋势——区块链、物联网和虚拟现实,分析它们的基本原理、发展趋势以及广泛的应用场景。通过深入浅出的语言,我们将揭示这些技术的内涵和潜在影响,帮助读者更好地理解这一轮技术变革的全貌及其未来的发展方向。
33 0