关于sha256实现的一些细节。
前言
上一篇介绍了sha256的简单用法,后来我在实际使用过程中遇到了一些问题,所以再补一章。
一、计算文件的摘要出错了?
我当时为了先把sha256的需求对付过去,所以获取出来的sha256跟网上的一样也就OK了,后来我试了下去计算一个大一点文件摘要,这时候就出问题了。不管怎么操作,一直跟网上的对不上,苦恼了好一会。研究了好些时间终于有点思路了。
二、问题出在哪里了
1.算法问题?
2.文件大小问题?
3.最终计算的源数据问题?
1.算法问题
对文件计算出错,我开始就想到了是不是实现有问题,我就去看网上的文章,但是最终的结果是,感觉几无差异,方法都是一样的,难道其他大佬没遇到这个问题?有用EVP实现的,但是不符合我们讨论的范畴。而且通过上一篇的文章我觉得我的实现应该八九不离十,所以我先暂时放一放这个点,进而去研究文件大小问题。
2.文件大小
1.数据源不对
既然大文件出错,那咱们就从小文件着手实现吧。先对一个测试文件实现sha256,文件中包含一个字符“1” 测试结果如下:
./$ a.out hhh.c
f1b2f662800122bed0ff255693df89c4487fbdcf453d3524a42d4ec20c3d9c04
跟这个线上的网站对比出现问题了。那就试试用指令行来处理试试
$ sha256sum hhh.c
f1b2f662800122bed0ff255693df89c4487fbdcf453d3524a42d4ec20c3d9c04 hhh.c
//然后继续用之openssl来计算
$ openssl dgst -sha256 -hex -out getsha256 hhh.c
$ cat getsha256
SHA256(hhh.c)= f1b2f662800122bed0ff255693df89c4487fbdcf453d3524a42d4ec20c3d9c04
跟我自己的算法算出来的一样?整蒙了都,那就开始怀疑是不是数据源有问题?我们用hexdump试试:
$ hexdump -C hhh.c
00000000 31 0d 0a |1..|
00000003
这时候发现了问题,我只是键入了“1”,为什么后面跟着“0d”,“0a”?
也许有某些编辑器机制我不了解,我先尝试去掉这些多余的字符。
$ hexdump -C hhh.c
00000000 31 |1|
00000001
//这次很干净
将数据源处理干净了,继续尝试计算sha256。
$ ./a.out hhh.c
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
$ sha256sum hhh.c
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b hhh.c
$ openssl dgst -sha256 -hex -out getsha256 hhh.c
$ cat getsha256
SHA256(hhh.c)= 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
这里验证了是数据源导致的之前sha256不一致,也反向证明了,我现在的算法是正确的。
后来经过研究,在对文件进行编辑的时候vi或者vim会自动在末尾添加换行。可以关闭自动加换行就能避免这个问题,如何配置读者可以自己修改配置文件–vimrc。
既然我们的算法已经对了,那就继续把数据加大验证。
$ hexdump -C hhh.c
00000000 31 31 31 31 31 31 31 31 31 31