SHA1

There are 2 entries for the tag SHA1

Python产生token唯一值的算法性能比较

MitchellChu 2015-11-08 其他技术

在很多场合的时候,我们都需要产生不重复的字符串来标志操作的唯一性,比如:HTTP请求中,我们需要产生SessionID,在数据存储的时候,我们也可能需要生成唯一的字符串来作为数据的ID以便我们进行索引。本文的由来是在使用tornado的时候,需要使用Session,Session需要有唯一的ID值。为了尽可能快速的生成安全可用的Session ID,而对Python当前的一些比较通用的生成方法进行了比较。为了方便说明,后继的所有说法均以token作为SessionID, 唯一字串等的统一表述。 在网络中比较流行的是使用uuid4().hex的方式来生成token,但另外一种声音是,uuid4().hex的安全性不高,需要使用安全性更高的算法来代替,后继出现了使用os.urandom(24),或者自行随机生成字符串的形式(uuid4使用的是os.urandom(16)),再到后来,使用OpenSSL和M2Crypto的方式来生成随机数。OpenSSL和M2Crypto需要Python安装pyOpenSSL和M2Crypto。M2Crypto由于接触少,因此没有对M2Crypto进行测试。   测试环境: CPU: Intel Xeon E3 3.30Hz 3.70Hz Memory: 16GB System: Windows 7 64-bits # times:测试次数 # func: 要测试的函数名称 # 此方法是入口方法 # 各个算法以函数的形式定义,接受times参数即可——By MitchellChu def crash_testx(times, func): import time print('\r\n--------------------------------------------') print("test function: %s" % func.func_name) print("begin time: %s" % time.strftime('%Y%m%d %X')) begin_time = time.time() (crashed_times, hash_data_len) = func(times) print("end time: %s" % time.strftime('%Y%m%d %X')) print("take time:%s" % (time.time() - begin_time)) print("test times: %d, crashed times:%d, hash data length:%d" % (times, crashed_times, hash_data_len)) print('--------------------------------------------\r\n')   产生方式(generate method) ...

Linux下校验下载文件的完整性(MD5,SHA1,PGP)

MitchellChu 2014-03-29 Unix & Linux

Linux下的学习开始总是艰难的,但有的时候,却发现Linux下远比Windows的操作来的实在的多——这下载文件的完整性就是其中一件,让本人觉着很爽的一件事情。在编译安装各种软件的时候,总要到各个网站上收集下软件源码包。正由于此,软件的入口就非常复杂,校验下载的文件是否被修改过就显得非常有必要了。而校验方法当前一般是MD5,SHA1,PGP三种。在Windows那个漫长的岁月里(沧桑有木有),一般只能接触到前两种——前提是你会去校验的话。 MD5校验 原理:对文件进行MD5 Hash,求出文件的MD5哈希值,通过下载后文件MD5哈希值和发布者提供的MD5哈希值是否一致来判断文件是否在发布者发布之后被篡改过。 说明:寿命老长的一个Hash算法,适用范围广,网站存储密码也经常使用。不同的文件产生的MD5哈希值是唯一的,但这点已经有办法通过对文件进行少量的修改,让文件的MD5后的哈希值保持一致。 使用:在CentOS下,要对文件进行MD5 Hash是很简单的,一个md5sum命令即可: # $是终端提示符,非输入. # #号是注释 # 没有提示符的是输出 #直接输出MD5 Hash $ md5sum your-downloaded-file-name fd4a1b802373c57c10c926eb7ac823d8 your-downloaded-file-name #将MD5 Hash值保存到md5-hash.txt文件中. $ md5sum your-downloaded-file-name > md5-hash.txt # 显示输出的md5-hast.txt内容 $ cat md5-hash.txt fd4a1b802373c57c10c926eb7ac823d8 your-downloaded-file-name # 通过md5-hash.txt来校验你下载的文件是否正确 $ md5sum -c md5-hash.txt your-downloaded-file-name: OK 你是文件的发布者话,你可以通过md5sum把文件的哈希值发送给验证者,这样下载你文件的人就可以通过MD5哈希值来验证你的文件正确性。反过来,我们在网站上下载文件之后,同时可以获取发布者的MD5哈希值和本地生成的Hash值对比,如果一致,认为文件是正确的。   SHA1校验 原理: 原理同MD5一样,都是通过对文件进行HASH求值,比对文件发布者发布的HASH值,通过是否相等判断文件是否被篡改 说明: SHA1 HASH求值方法可以说是MD5的一个升级版本(SHA1 20位,MD5 16位),在HASH求值方面,MD5退出的舞台将有SHA1占据。SHA家族有五个算法:SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,后四种有时候称为SHA2 使用: CentOS有SHA1的命令:sha1sum # 说明同上 # 直接输出SHA1 Hash $ sha1sum your-downloaded-file-name 12dc96cbd822598c1230c87622f3591461a77227 your-downloaded-file-name # 将SHA1 Hash值保存到文件中 $ sha1sum your-downloaded-file-name > sha1-hash.txt # 显示文件内容 $ cat sha1-hash.txt 12dc96cbd822598c1230c87622f3591461a77227 your-downloaded-file-name #通过sha1-hash.txt来校验我们下载的文件your-downloaded-file-name # 注意,文件必须要要通过txt文件中的路径知道哦 $ sha1sum -c sha1-hash.txt your-downloaded-file-name: OK  这个SHA1和MD5基本一致,需要补充说明下的是,在使用md5sum也好,还是sha1sum也罢,校验文件的时候,务必要让系统能够根据文件中提供的路径找到文件,如果文件找不到,是没有办法进行校验的。 如果是做多个文件的Hash校验,可以通过一个文件保存多个文件的Hash值即可。   PGP校验 原理:使用非对称加密,程序生成唯一的密钥对(公钥和私钥:Public Key和Private Key/Secret Key)。操作方法如下: 发布者通过用生成的密钥对中的私钥对要发布的文件进行签名,得到签名文件(sign); 发布者将密钥对中的公钥发布到公钥服务器; 发布者将文件和用私钥生成的签名一起发布; 验证者下载发布者发布的文件和签名; 使用PGP的程序获取的发布者第二步发布的公钥; 使用公钥校验文件签名 说明:签名算法中,密钥的用处分别是:公钥用于加密信息和验证,私钥用于解密和签名。私钥掌握在信息发布方,公钥可以任意分发。信息发布方用密钥进行对信息进行签名,接收方在获取公钥后,可以用公钥对发布方发布的信息+签名进行验证。如果验证失败则认为信息被篡改。在网络中,我们经常碰到的HTTPS协议,使用了同样的机制。 使用:由于PGP是商业应用程序,在CentOS/Linux中,具有同类功能的是GPG(也就是:GnuPG),同样遵守OpenPGP数据加密标准(RFC 4880),没有安装可以用yum install gnupg安装,命令是:gpg # 说明同上 # 由于过程相对复杂,并且在实际使用中,校验用的比较多,因此这里只介绍文件的校验过程。 # 在获得文件和签名时,我们先用gpg校验签名,此时文件必须存在 $ gpg --verify downloaded-file-sign.asc  这里有多种情况,如果你只有签名,但生成签名的文件不存在时(系统没找到,一般应该放在同目录下面),返回的是: gpg: 不含签名的数据 gpg: can't hash datafile: No data 当你有文件的时候,但还没有与签名对应的公钥时,gpg返回的信息类似下面: gpg: 于 2013年05月06日 星期一...

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。