安全
区块链技术以其安全性、去中心性以及算法保证的可信性吸引了包括金融机构、供应链、能源等多领域的关注。这一切都依赖于对加密算法的综合运用。
Java的加密知识也是Java常见的领域之一。加密技术的底层确实很复杂,运用了大量的数学知识,要弄明白非常复杂。但是Java语言中运用密码加密工具却是非常简单。我们在Java里面运用这些加密技术,只需要把原理和使用场景等搞明白就可以了,具体底层实现不用研究。常用的加密算法有对称加密算法,非对称加密算法,哈希算法,数字签名等几类。
对称加密
对称加密顾名思义就是加密和解密是对称的,加密时用一个秘钥去加密,解密时用同一个秘钥去解密,由信息发送方和接收方共同约定一个秘钥。缺点是风险都在这个秘钥上面,一旦被窃取,信息会暴露。所以安全级别不够高。常用对称加密算法有DES,3DES,AES等。在jdk中也都有封装。
非对称加密
非对称加密,顾名思义就是加密与解密的过程不是对称的,不是用的同一个秘钥。非对称加密有个公私钥对的概念,也就是有两把秘钥,一把是公钥,一把是私钥,一对公私钥有固定的生成方法,在加密的时候,用公钥去加密,接收方再用对应的私钥去解密。使用时可以由接收方生成公私钥对,然后将公钥传给加密方,这样私钥不会在网络中传输,没有被窃取的风险。比如github底层的ssh协议就是公私钥非对称加密。并且公钥是可以由私钥推导出来的,反过来却不行,通过公钥无法推导出私钥。常用非对称加密算法有RSA,ECC等。ECC也是比特币底层用的比较多的算法。通过和对称加密的对比,可以看到,非对称加密解决了秘钥传输中的安全问题。
哈希算法
哈希算法,简单说就是将任意数据都转换成一个固定长度的字符串。通过哈希后的值几乎无法推导出原文。而且两个不同的原文哈希后结果一定不同。常用算法有MD5,SHA256等等。常用场景例如,md5常用场景是数据库的密码存储。sha256在挖矿中可以用到。
数字签名
非对称加密也有一个问题,就是内容在发送前可能被篡改,因为公钥是有可能被窃取的,所以窃取者完全可以改为发送别的内容。解决的办法就是数字签名。数字签名和非对称加密是反过来的,也是有公私钥对,但是是用私钥签名(加密),用公钥去验证签名。比如发送方除了发送用公钥加密后的密文,还要发送签名,签名内容通常是加密然后再哈希后的字符串,接收方首先验证签名是否正确,如果正确那么密文解密后就是真正需要并且没有被篡改过的内容。注意,签名和非对称加密需要用两对不同的公私钥。
上面是对几个加密算法的一个简单介绍,除了上面的之外,还有一些编解码技术,比如base58等,比特币底层安全也是依赖于加密和编码。后面会一个一个介绍要用到的加密算法的原理和使用,但是底层不会讨论。