2021-08-06 来源:华纳网 责任编辑:railgun 人气:
核心提示:【谷雨课堂】Go实战 No.030 Go干货!MD5、SHA、CRC、Base64

知识点:

MD5

SHA

CRC

Base64

 

本课内容:

大家好,欢迎来到谷雨课堂,

 

本节干货,我们来实现常用的哈希值算法

简单的说就是实现MD5、SHA、CRC

 

以上三种哈希,常用于数据的验证,

也可以用来数据的加密,

其中在保存用户密码时,

通常就是把密码“加盐”(salt)

再md5后得到一个字符串进行保存

这样即不是通常的md5也没有保存真正的密码

 

因为不同输入值的输出完全不同

但,现在计算能力的提升,

其实是可以碰撞出来相同的结果的

 

而Base64准确的说不是加密,

因为它是可逆的,

所以Base64只是一种编码

 

好了,直接上干货,拿去就能用

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
package main
import ("crypto/md5""crypto/sha1""encoding/base64""encoding/hex""fmt""hash/crc32")
// 计算给定字符串的md5值func MD5(str string) string {  c := md5.New()  c.Write([]byte(str))return hex.EncodeToString(c.Sum(nil))}
// 计算给定字符串的sha1值func SHA1(str string) string {  c := sha1.New()  c.Write([]byte(str))return hex.EncodeToString(c.Sum(nil))}
// 计算给定字符串的crc32值func CRC32(str string) uint32 {return crc32.ChecksumIEEE([]byte(str))}
// 计算给定字符串的base64func to_base64(str string) string {return base64.StdEncoding.EncodeToString([]byte(str))}
// 将base64转换为字符串func from_base64(str string) string {  decoded, err := base64.StdEncoding.DecodeString(str)if err != nil {return ""  }  decodestr := string(decoded)return decodestr}
func main() {  fmt.Println(CRC32("admin"))  fmt.Println(MD5("admin"))  fmt.Println(SHA1("admin"))  s1 := to_base64("admin")  fmt.Println(s1)  fmt.Println(from_base64(s1))}

 

扩展阅读(哈希算法):

 

哈希算法(Hash Algorithm)又称

散列算法、散列函数、哈希函数,

是一种从任何一种数据中创建小的数字“指纹”的方法。

哈希算法将数据重新打乱混合,

重新创建一个哈希值。

 

哈希算法通常有以下几个特点:

 

正像快速:原始数据可以快速计算出哈希值

逆向困难:通过哈希值基本不可能推导出原始数据

输入敏感:原始数据只要有一点变动,得到的哈希值差别很大

冲突避免:很难找到不同的原始数据得到相同的哈希值

哈希算法主要用来保障数据真实性(即完整性),

即发信人将原始消息和哈希值一起发送,

收信人通过相同的哈希函数来校验原始数据是否真实。

 

以上不能保证数据被恶意篡改,

原始数据和哈希值都可能被恶意篡改,

要保证不被篡改,

可以使用RSA公钥私钥方案,

再配合哈希值。

哈希算法主要用来防止计算机传输过程中的错误,

早期计算机通过前7位数据第8位奇偶校验码来保障

(12.5%的浪费效率低),

对于一段数据或文件,

通过哈希算法生成128bit或者256bit的哈希值,

如果校验有问题要求重传。

哈希算法主要有MD4、MD5、SHA。

 

MD4 1990年 输出128位 (已经不安全)

MD5 1991年 输出128位 (已经不安全)

SHA-0 1993年 输出160位 (发布之后很快就被NSA撤回,是SHA-1的前身)

SHA-1 1995年 输出160位 (已经不安全)

SHA-2包括SHA-224、SHA-256、SHA-384,和 SHA-512,分别输出224、256、384、512位。(目前安全)

冲突避免:

 

2的128次方为

340282366920938463463374607431768211456,

也就是10的39次方级别

 

2的160次方为

1.4615016373309029182036848327163e+48,

也就是10的48次方级别

 

2的256次方为

1.1579208923731619542357098500869 × 10的77次方,

也就是10的77次方

 

宇宙中原子数大约在10的60次方到80次方之间,

所以2的256次方有足够的空间容纳所有的可能,

算法好的情况下冲突碰撞的概率很低。


 

完整的源代码可以登录【华纳网】下载。

 

https://www.worldwarner.com/




 





免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。