密码学是学习区块链技术最重要的课程之一。
因为区块链技术,包括比特币,它们之所以这么安全,最重要的基石就是密码,包括非对称加密、哈希、数字签名这些技术。
如果不理解密码,就不能理解之后的签名、地址、验证等问题。
对非专业研究算法的我们来说,密码学的原理并不复杂,关键掌握以下要点:
一、进制&存储单位
1、进制是一种计数方法
(注:上图“2进制”与“10进制”写反了)
2、存储单位
(注:上图“BG”应为“GB”,“TG”应为“PG”)
比特币挖矿算力8359PH/s,指比特币每秒钟的算力达到8359PG的哈希量。
二、加密解密
1、对称加密
对称加密中,密钥只有一个,一旦密钥丢失或被盗,任何得到密钥的人都能解密信息。这也正是对称加密的缺点,传递过程中无法确保密钥的绝对安全。
对称加密中的密钥就类似于我们在谍战剧中看到的密码本,任何得到密码本的人都可以根据密码本破译出原文,所以密码本的安全传递就非常重要。
那怎样才能更安全的传递信息呢?
这就需要非对称加密。
2、非对称加密
非对称加密由公钥和私钥进行加密。
私钥是本机电脑上自动生成的。公钥是私钥根据算法生成的。
传递的只是公钥。私钥由个人保存,用于解密。
发送方将信息用接收方的公钥进行加密(公钥可以公开),随机生成一段密文,接收方接到密文后,用自己的私钥进行解密,还原信息。
整个过程解决了安全问题,但没有解决“接收方如何验证信息是由指定的发送方发送”的问题。
就好比我收到了一个信息,我还原了这个信息,我如何知道这个信息是你发给我的而不是别的人发给我的?
这就需要数字签名。
在谈数字签名之前,我们先谈谈另一个重要的概念:哈希。
三、哈希-Hash
哈希是将一段任意长度的数据,转换为一段定长的数据。
我们可以根据原数据生成哈希值,但无法通过哈希倒推出原数据。这个过程是不可逆的。
(公钥加密后生成的密文是随机的,但都能用对应的私钥进行解密。
而同一数据生成的哈希值是确定的,因此哈希值可以用来验证数据。)
下图为哈希运算界面
你可以将任意长度的数据,无论是几K或是几G的文件输入,点击“Hash”,就会生成很多格式的哈希值。以前比较常用的有MD5,但是随着计算机算力的增强现在它的安全性受到了挑战。现在比特币的哈希值采用的是“SHA-256”格式,今后也许会采用“SHA-384”或其它长的格式。
哈希可以用于很多方面。比如财务软件安全下载。
如果你要下载一款炒股的软件,下载界面就会出现它的哈希结果:MD5……
当你下载完成以后,你想验证你所下载的这个软件是不是安全的,你就可以对这个下载的文件进行哈希:
然后生成的哈希结果与原下载界面的哈希结果进行比对验证,如果一致,证明这个软件是安全的,没有被篡改过。
哈希还可以用于用户密码的存储:
现在很多服务器都不直接存储用户密码的明文,那样一旦被攻击,或者发生数据库管理员监守自盗,所有的信息直接暴露。
因为哈希的不可逆性,哈希值可以用来验证用户密码,却不能倒推出用户密码,所以现在大多服务器存储的都是哈希。
但是哈希存储可以用“彩虹表攻击”的方法,就是先大量的输入猜测的密码,用生成的哈希值与服务器存储的哈希值作比对,一旦一致就可以倒推出用户密码。
针对“彩虹表攻击”,现在很多服务器采取的是“盐+哈希”存储的方式,就是在原密码的基础上,引入一个随机数,比如时间,当做“盐”,生成一个新的哈希,这样就使得彩虹表失效。
四、签名
发送方将信息用接收方的公钥进行加密,生成一个随机的密文,发送给接收方。
接受方接到密文后,用自己的密钥进行解密,得到一个信息。
接收方如何确认这个信息是指定的发送方所发送的呢?
这就需要数字签名。
发送方先将信息进行哈希,生成的摘要用自己的私钥进行签名,然后发送给接收方。
接收方接收后,用发送方的公钥进行解密,生成一个摘要。
然后接收方再把之前收到的信息进行哈希,生成一个摘要。两个摘要做比对,如果一致,就证明是确定的发送方发送的。
在实际应用中,由证书授权重心CA来证明“我确实是我”。
五、结语
相信学完这一课,你对公钥、私钥、哈希、签名等都有了新的认识。
公钥加密,私钥解密。
私钥签名,公钥解密。
区块链的世界,切记要保护好自己的私钥。
(本文根据新大区块链课程整理,授课人:周兵,图片来源:课程PPT)