知识点:
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))
}
// 计算给定字符串的base64
func 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/
免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。