go语言加解密算法 md5 sha256

MD5

  1. md5介绍

    md5的全称为md5信息摘要算法(MD5 Message-Digest Algorithm),是一种被广泛应用的密码散列函数,产生一个128位(16字节)的散列值,最常见的是32位的16进制表示,如:0caa3b23b8da53f9e4e041d95dc8fa2c,用以确保信息传输的完整一致。md5将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的md5信息摘要,文件的md5类似于人的指纹,是世界上独一无二的,如果任何人对文件做了改动,其md5值也会发生变化。

    md5与对称和非对称的加密算法不同,这两种密码是防止信息被窃取,而md5的目的是验证原文的完整性。

  2. md5的特性

    • 不可逆

      没有系统有办法知道md5原来的文字是什么

    • 具有高度的离散性

      md5码具有高度的散列性,没有规律可循,哪怕原信息只有一点点的变化,比如多个空格,那么就会导致md5发生巨大变化,也可以说产生的md5码是不可预测的

    • 压缩性

      任意长度的数据,算出的md5值得长度都是固定的。

    • 弱碰撞性

      已知原数据和其md5的值,想找到一个具有相同md5值得数据(即伪造数据)是非常困难的。

  3. md5的用途

    • 密码的加密存储

      用户设置密码时,服务端只记录这个密码的MD5,而不记录密码本身,以后验证用户身份时,只需要将用户输入的密码再次做一下MD5后,与记录的MD5作一个比较即可验证其密码的合法性。

    • 数字签名

      比如发布一个程序,为了防止别人在你的程序里插入病毒或木马,你可以在发布这个程序的同时,公开这个程序文件的MD5码,这样别人只需要在任何地方下载这个程序后做一次MD5,然后跟公开的这个MD5作一个比较就知道这个程序是否被第三方修改过。

    • 文件完整性验证

      比如当下载一个文件时,服务器返回的信息中包括这个文件的md5,在本地下载完毕时进行md5,将两个md5值进行比较,如果一致则说明文件完整没有丢包现象

    • 文件上传

      比如百度云实现的秒传,就是对比你上传的文件md5在百度服务器是否已经存在了。

  4. 注意事项

    • 同一个文件用不同的语言计算出来的md5一样吗?

      只要算法正确,都是一样的。

    • 拷贝的文件md5会改变吗?

      不会。

    • 还有什么其他的摘要算法么?

      SHA-1,SHA-2(包括SHA-224,SHA-256,SHA-384)等

SHA256

​ SHA256 是安全散列算法 SHA(Secure Hash Algorithm)系列算法之一,其摘要长度为256 bits,即32个字节,故称SHA256。SHA系列算法是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等变体。主要适用于数字签名标准(DigitalSignature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。

  1. 字符串的哈希值

    计算字符串的哈希值,一共分为3步:

    1. sha256.New 2. Write中写入需要hash的内容 3. h.Sum生成hash值
func hashSHA256String(input string) []byte{
	h := sha256.New()
	h.Write([]byte(input))
	return h.Sum(nil)
}
  1. 文件哈希值
func hashSHA256File(filePath string)(string, error) {
 	var hashValue string
 	file, err := os.Open(filePath)
 	if err != nil {
		fmt.Printf("openfile error!")
		return hashValue, err
	}
 	defer file.Close()
 	hash := sha256.New()
 	if _, err := io.Copy(hash, file); err != nil {
 		return hashValue, err
	}
 	hashInBytes := hash.Sum(nil)
 	hashValue = hex.EncodeToString(hashInBytes)
 	return hashValue, nil
 }

你可能感兴趣的:(go语言学习)