首页 > 其他分享 >区块链基础之密码学及安全技术

区块链基础之密码学及安全技术

时间:2023-06-24 19:35:46浏览次数:28  
标签:En 加密 1.2 int 安全 哈希 maxLength 区块 密码学

1.2 密码学及安全技术

区块链中的密码学与安全技术

1.2.1 密码学知识

1.2.1.1 Hash函数
  • Hash(哈希) 哈希函数是一类数学函数,可以在有限合理的时间内,将任意长度的消息压缩为 固定长度的输出值,并且是不可逆的。其输出值称为哈希值,也称为散列值。 hash算法

  • 哈希算法的应用: 消息认证:确保收到的消息和发送的消息都是未被篡改的。 数字签名:对消息摘要进行数字签名与对消息本身进行数字签名等效。 口令的安全性:仅将口令的哈希值进行保存,进行口令检验时仅需对比哈希值即可,即使攻击者获取了口令的哈希值,也无法计算出口令。 数据完整性:具有抗数据篡改的能力。

  • Hash函数在区块链中的应用 在区块链系统中,哈希算法得到了广泛的使用。 在区块链系统中,区块之间的链接就是通过区块的哈希值串联起来的。除此以外,还有梅克尔树的生成计算,交易事务的哈希值计算等。 区块链是一个使用哈希指针构建的链表 区块链与链表

  • Merkle tree Merkle(默克尔)树,又叫哈希树,是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成 应用场景: 快速比较大量数据 快速定位修改 Merkle tree

1.2.1.2椭圆曲线加密算法

即:Elliptic Curve Cryptography,简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。 相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密。

1.2.2 安全技术

1.2.2.1 数字签名

用于防止消息篡改和抵赖的场景 数字签名基于非对称加密,既可以用于证实内容的完整性,又同时可以确 认来源(或不可抵赖,Non-Repudiation)。 数字签名的全过程分两大部分,即签名与验证。一侧为签名,一侧为验证 过程。

1.2.2.2 数字证书

数字证书

1.2.2.3 PKI体系

!PKI体系](/i/li/?n=2&i=images/202306/556acf531d00dd9588b245a828f0a1183813b5.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

1.2.2.4 同态加密

本质上,同态加密是指这样一种加密函数,对明文进行环上的加法和乘法运算再加密,与加密后对密文进行相应的运算,结果是等价的。由于这个良好的性质,人们可以委托第三方对数据进行处理而不泄露信息。具有同态性质的加密函数是指两个明文a、b满足Dec(En(a)⊙En(b))=a⊕b的加密函数,其中En是加密运算,Dec是解密运算,⊙、⊕分别对应明文和密文域上的运算。当⊕代表加法时,称该加密为加同态加密:当⊕代表乘法时,称该加密为乘同态加密。

全同态加密是指同时满足加同态和乘同态性质,可以进行任意多次加和乘运算的加密函数。用数学公式来表达,即Dec(f(En(m1),En(m2),…,En(mk)))=f(m1,m2,…,mk),或写成:f(En(m1),En(m2),…,En(mk))=En(f(m1,m2,…,mk)),如果f是任意函数,称为全同态加密。

1.2.2.5 布隆过滤器
class BloomHash {

	/**
	 * Hash工具类返回的hashcode的最大长度<br>
	 * maxLength为2的n次方,返回的hashcode为[0,2^n-1]
	 */
	public int maxLength;

	// Hash函数生成哈希码的关键字
	public int seed;

	public BloomHash(int maxLength, int seed) {
		this.maxLength = maxLength;
		this.seed = seed;
	}

	/**
	 * 返回字符串string的hashcode,大小为[0,maxLength-1]
	 * 
	 * @param string
	 * @return
	 */
	public int hashCode(String string) {
		int result = 0;
		// 这个构建hashcode的方式类似于java的string的hashcode方法
		// 只是我这里是可以设置的seed,它那里是31
		for (int i = 0; i < string.length(); i++) {
			char a = string.charAt(i);
			int b = seed * a; // 隐式的把字符转换为整数(ASSIC码)
			result = result + b;
		}
		/**
		 * public static int indexFor(int m, int n){ return m & (n - 1); } public static
		 * void main(String[] args) { System.out.println("19 与 16 求余 = "+ indexFor(19,
		 * 16) ); System.out.println("19 与 16 求余 = "+ 19 % 16 ); }
		 * 此方法中n为2的指数值,则其二进制形式的表示中只存在一个1,其余位都为0, 例如: 0000 1000、0100 0000、0010
		 * 0000等等。则n-1的二进制形式就为1的位数变为0, 其右边位全变为1,例如16的二进制  0001 0000 -1 = 0000
		 * 1111测试m为19的二进制 0001 0011 & 0000 1111 = 0000 0011 = 3,地位保留的结果便是余数。此位运算也是
		 * HashMap中确定元素键(key)值所在哈希数组下标位置的核心方法,此位运算(hash & (length - 1)) 的效率极高于hash %
		 * length的求余, 所以也解释为什么HashMap的扩容始终为2的倍数(2的指数值)。
		 */
		// 保证结果在[0,maxLength-1]:equal to 'result % maxLength'
		return result & (maxLength - 1);
	}
}

public class BloomFilter {

	// 构建hash函数的关键字,总共7个
	private static final int[] HashSeeds = new int[] { 3, 5, 7, 11, 13, 17, 19 };

	// Hash工具类的数组
	private static BloomHash[] HashList = new BloomHash[HashSeeds.length];

	// BloomFilter的长度,最好为插入数量的10倍,目前为2的20次方,大约100万个
	private static final int BloomLength = 1 << 20;

	// 对位的操作类,java自带的BitSet,共BloomLength个bit
	private BitSet bitSet = new BitSet(BloomLength);

	public BloomFilter() {
		// 初始化Hash工具类的数组,每个hash工具类的hash函数都不同
		for (int i = 0; i < HashSeeds.length; i++) {
			HashList[i] = new BloomHash(BloomLength, HashSeeds[i]);
		}
	}

	/**
	 * 在布隆过滤器中加入值value,在多个hash函数生成的hashcode对应的位置上,置1
	 * 
	 * @param value字符串,如果为数字,可以自己转化成string
	 */
	public void addValue(String value) {
		for (int i = 0; i < HashSeeds.length; i++) {
			// 根据对应的hash函数得到hashcode
			int hashcode = HashList[i].hashCode(value);
			// 在位图中,将对应的位,设置为1
			bitSet.set(hashcode);
		}
	}

	/**
	 * 在布隆过滤器中,检验是否可能有值value
	 * 
	 * @param value
	 * @return 如果返回false,则一定没有<br>
	 *         如果返回true,就代表有可能有
	 */
	public boolean existsValue(String value) {
		boolean result = true;
		for (int i = 0; i < HashSeeds.length; i++) {
			// 根据对应的hash函数得到hashcode
			int hashcode = HashList[i].hashCode(value);

			/**
			 * 隐式把boolean转换为整数进行按位与运算 “短路” 主要用于逻辑运算符中,即 “ ! && || "这三种运算符 短路 就是知如果左侧的
			 * 表达式能确定运算后的结果,则不再计算右侧的表达式。 如(1>2)&&(2<3) 明明左侧已经为假 了 我 不用计算右侧我一定知道 此表达是为假
			 */
			// 将result与对应位置上的0或1 做与运算
			// 如果全为1,则result最后为1
			// 如果有一个位置上为0,则最后result为0
			result = result & bitSet.get(hashcode);
		}
		return result;
	}
}

标签:En,加密,1.2,int,安全,哈希,maxLength,区块,密码学
From: https://blog.51cto.com/u_15743821/6541412

相关文章

  • 区块链基础之密码学及安全技术
    1.2密码学及安全技术1.2.1密码学知识1.2.1.1Hash函数Hash(哈希)哈希函数是一类数学函数,可以在有限合理的时间内,将任意长度的消息压缩为固定长度的输出值,并且是不可逆的。其输出值称为哈希值,也称为散列值。哈希算法的应用:消息认证:确保收到的消息和发送的消息都是未......
  • 使用了并发工具类库,线程安全就高枕无忧了吗?
    1、说明在代码审核讨论的时候,我们有时会听到有关线程安全和并发工具的一些片面的观点和结论,比如“把HashMap改为ConcurrentHashMap,就可以解决并发问题了呀”,“要不我们试试无锁的CopyOnWriteArrayList吧,性能更好”。事实上,这些说法都不太准确。的确,为了方便开发者进行多线程编......
  • WEB安全-渗透测试-waf绕过信息收集
    waf绕过WAF拦截会出现在安全测试的各个层面,掌握各个层面的分析和绕过技术最为关键本文主要讲述以下四种环境下的waf绕过Safedog-默认拦截机制分析绕过-未开CCSafedog-默认拦截机制分析绕过-开启CCAliyun_os-默认拦截机制分析绕过-简要界面BT(防火墙插件)-默认拦截机制分......
  • Web常见安全问题
    1.SQL注入SQL注入是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL......
  • VMware vCenter Server 7.0 Update 3m 发布下载(重要安全更新)
    VMwarevCenterServer7.0Update3m发布下载(重要安全更新)请访问原文链接:https://sysin.org/blog/vmware-vcenter-7-u3/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwarevCenterServer是一款高级服务器管理软件,提供了一个集中式平台来控制vSphere环境,以实......
  • VMware vCenter Server 8.0U1b 发布下载(重要安全更新)
    VMwarevCenterServer8.0U1b发布下载(重要安全更新)请访问原文链接:https://sysin.org/blog/vmware-vcenter-8-u1/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwarevCenterServer是一款高级服务器管理软件,提供了一个集中式平台来控制vSphere环境,以实现跨混......
  • "system32/secpol" 是指位于Windows操作系统的system32文件夹下的一个名为secpol.msc
    "system32/secpol"是指位于Windows操作系统的system32文件夹下的一个名为secpol.msc的文件。该文件是本地安全策略管理器(LocalSecurityPolicy)的主控制台。它允许用户管理和配置计算机的安全策略。本地安全策略管理器提供了一系列安全设置,可以帮助管理员保护系统免受未经授权的......
  • 密码学:凯撒密码(移位密码)原理、加密与解密(Python代码示例)
    原理凯撒密码(移位密码):是一种替换加密,明文中的所有字母都在字母表上向后或向前按照一个固定数目进行偏移后被替换成密文。例如,偏移量为3位的时候:A对应D,B对应E,C对应F等当偏移量为13位的时候,凯撒密码又叫回转密码(ROT13):明文加密得到密文,密文再加密就会得到明文(因为偏移量为13位,一共......
  • Linux 服务器必备的安全设置
    Linux服务器必备的安全设置,建议收藏!!!马哥Linux运维 2023-06-2022:56 发表于浙江好不容易买了服务器,如果因为自己的疏忽,被黑客黑掉的话,那真的是太糟糕了!下面告诉你一些简单的方法提高服务器的安全系数,我的云服务器就是这么配置的,虽然有些麻烦,但是感觉安心一些。修......
  • 怎么保证接口安全
    1.首先应该考虑使用https协议,因为http协议是不安全的,一般来说购买服务器的时候厂商都会送免费的https的ssl证书,只需要在nginx配置就可以了。2.接口应该开启加密,分为对称加密和非对称加密3.对称加密:客户端和服务端使用同一个秘钥4.非对称加密:5.数据验签,避免黑客通过抓包......