本文主要是让我们了解比特币中所用到的Hash(SHA-256)算法.我们从什么是Hash,常见的哈希算法有那些,当前主流使用的哈希算法是什么,哈希算法的性能及安全和建议,最后我们看C#怎么实现SHA-256算法。
Hash定义及是什么:
Hash(哈希或散列)算法是非常基础也非常重要的计算机算法,它能将任意长度的二进制明文映射为较短的(通常是固定长度的)二进制Hash值,并且不同的明文很难映射为相同的Hash值。
例如:SHA-256(123456)=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
SHA-256(我们今天来看看比特币使用的Hash(SHA-256)算法)=4208d006395df44386329cd5720040f5bff4f34b57b78e39f879f4ca94c3ad94
以上两个例子,第一个(123456)例子和第二个(我们今天来看看比特币使用的Hash(SHA-256)算法)例子,通过哈希(SHA-256)算法把不同长度的明文字符映射为固定长度字符。也就是说只要是SHA-256计算后的结果为:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92,则说明该内容极大概率上就是(123456).
常见的Hash算法及主流使用算法是:
目前常见的Hash算法包括MD5和SHA(SHA-1、SHA-2、SHA-3).
MD4(RFC 1320)是MIT的Ronald L.Rivest在1990年设计的,MD是Message Digest的缩写。其输出为128位。MD4已被证明不够安全。
MD5(RFC 1321)是Rivest于1991年对MD4的改进版本。它对输入仍以512位进行分组,其输出是128位。MD5比MD4更加安全,但是过程更加复杂,计算速度也慢一些。MD5已被证明不具备”强抗碰撞性”。
SHA(Secure Hash Algorithm)并非一个算法,而是一个Hash函数族。NIST(NationalInstitute of Standards andTechnology)于1993年发布其首个实现。知名的SHA-1算法1995年面世,它输出长度160位的Hash值,抗穷举性更好。SHA-1设计模仿了MD4算法,采用类似原理。SHA-1已被证实不具备“强扛碰撞性”。
为了提高安全性,NIST还设计出了SHA-224、SHA-256、SHA-384和SHA-512算法(SHA-2),跟SHA-1算法原理类似。SHA-3相关算法也已经被提出。
现在还是有很多系统采用的MD5和SHA-1算法,但是这些算法已经不安全了,一般现在推荐至少使用SHA-256或更安全的算法。
性能及安全和建议:
Hash算法一般都是计算敏感型的。也意味着计算资源是瓶颈,主频越高的CPU运行Hash算法速度越快。因此可以通过硬件加速来提升Hash计算的吞吐量。也有一些Hash算法不是计算敏感型的。例如scrypt算法,计算过程需要大量内存资源,节点不同通过简单地添加更多CPU来获得Hash性能提升。这样的Hash算法经常用来避免算力攻击的常景。
Hash算法不是一种加密算法,不能用于对信息的保护,但是Hash算法畅用于对口令的保存上。例如用户登录网站需要通过用户名口令来验证。如果网站后台数据库直接保存用户口令的明文,一旦数据库发生泄漏后果不堪设想。
利用Hash的特性,后台可以仅保存密码的Hash值,这样只要比对Hash值一致,则说明输入的口令正确,及时数据库泄露了,也无法从Hash值还原口令,只能进行穷举测试。
由于用户设置的口令的强度不够,只是简单字符串,例如上面我们说的password、123456、654321或者生日等。有人通过这些口令,计算对应的Hash值,制作对应的哈希值库。这样通过Hash值可以快速反查原始口令。
为了防范这一类攻击,我们建议不要用简单的口令及个人生日作为口令,现今个人身份信息很容易得到,以上是个人建议。
如果是网站或者说是系统,可以采用在口令基础上添加随机数后进行Hash且随机数存放在不同的地方,这样只要不是两者同事泄露,攻击者就很难破解。
最后我们用C#方式展示SHA-256算法:
首先我们需要引用类:
usingSystem.Security.Cryptography
声明字节数组来接收需要序列化的字符串:
byte[] bytValue =System.Text.Encoding.UTF8.GetBytes(“123456”);
然后调用Hash(SHA-256),传入字节数组:
SHA256 sha256 = newSHA256CryptoServiceProvider();
声明字节数组接收已经哈希的值:
byte[] retVal =sha256.ComputeHash(bytValue);
以上是我们谈的内容,如果需要深入了解,哪我们感觉行动吧!