您现在的位置是:首页 > 学习笔记 > 密码学密码学

单向散列函数

冰山2019-09-28【密码学】人已围观

简介1. 单向散列函数
1.1 定义
1.2 关于术语
1.3 单向散列函数的性质
1.4 单向散列函数的实际应用
1.4.1检测软件是否被篡改
1.4.2消息认证码
1.4.3数字签名
1.4.4伪随机数生成器
1.4.5一次性口令
1.5 常用的单向散列函数
1.5.1 MD4、MD5
1.5.2 Golang中使用MD5
1.5.3 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512标准


res := fmt.Sprintf("%x", result)
fmt.Println(res)
// --- 这是另外一种格式化切片的方式
res = hex.EncodeToString(result[:])
fmt.Println("res: ", res)
return  res
}
 
重要函数总结:

1)返回数据data的MD5校验和函数所属的包:"crypto/md5"

func Sum(data []byte) [Size]byte
- 参数 data: 原始数据
- 返回值: 经过md5计算之后得到的数据, 长度为 16字节(byte)
 
2)将字符串编码为16进制格式,函数所属的包:"encoding/hex"

func EncodeToString(src []byte) string
 - 参数 src: 要转换的数据
- 返回值: 转换之后得到的16进制格式字符串
 
计算Md5的方式2
 
func getMD5_2(str []byte) string {
 
// 1. 创建一个使用MD5校验的Hash对象`
myHash := md5.New()

// 2. 通过io操作将数据写入hash对象中
io.WriteString(myHash, "hello")
myHash.Write([]byte(", world"))

// 3. 计算结果
result := myHash.Sum(nil)
fmt.Println(result)

// 4. 将结果转换为16进制格式字符串
res := fmt.Sprintf("%x", result)
fmt.Println(res)
res = hex.EncodeToString(result)
fmt.Println(res)
return res
}
 
重要函数总结:

1)创建一个新的使用MD5校验的hash.Hash接口,函数所属的包:"crypto/md5"

func New() hash.Hash
 
Hash是一个被所有hash函数实现的公共接口。
 
   type Hash interface {
    // 通过嵌入的匿名io.Writer接口的Write方法向hash中添加更多数据,永远不返回错误
    io.Writer
    // 返回添加b到当前的hash值后的新切片,不会改变底层的hash状态
    Sum(b []byte) []byte
    // 重设hash为无数据输入的状态
    Reset()
    // 返回Sum会返回的切片的长度
    Size() int
    // 返回hash底层的块大小;Write方法可以接受任何大小的数据,
    // 但提供的数据是块大小的倍数时效率更高
    BlockSize() int
}
 
"io" 包中 Writer 接口用于包装基本的写入方法。

type Writer interface {
    Write(p []byte) (n int, err error)
}
 
2)通过io操作将数据写入hash对象中# 第一种方式,函数所属的包: "io"

func WriteString(w Writer, s string) (n int, err error)
    - 参数 w: 实现了/包含Writer接口的对象
    - 参数 s: 要添加到IO对象中的数据
    - 返回值 n: 数据长度
    - 返回值 err: 错误信息

 
3)使用hash.Hash接口中的Sum方法计算结果 

Sum(b []byte) []byte
 - 参数 b: 将b中的数据进行哈希计算, 结果添加到原始数据的前面,
一般情况下该参数指定为空, 即: nil
- 返回值: 进行哈希运算之后得到的结果
 

1.5.3  SHA-1、SHA-224、SHA-256、SHA-384、SHA-512标准


SHA-1是由NIST(NationalInstituteOfStandardsandTechnology,美国国家标准技术研究所)设计的一种能够产生160比特的散列值的单向散列函数。1993年被作为美国联邦信息处理标准规格(FIPS PUB 180)发布的是SHA,1995年发布的修订版FIPS PUB 180-1称为SHA-1。

SHA-1的消息长度存在上限,但这个值接近于2^64^比特,是个非常巨大的数值,因此在实际应用中没有问题。

SHA-256、SHA-384和SHA-512都是由NIST设计的单向散列函数,它们的散列值长度分别为256比特、384比特和512比特。这些单向散列函数合起来统称SHA-2,它们的消息长度也存在上限(SHA-256的上限接近于 2^64^ 比特,SHA-384 和 SHA-512的上限接近于 2^128^ 比特)。

这些单向散列函数是于2002年和 SHA-1 一起作为 FIPS PUB 180-2发布的 SHA-1 的强抗碰撞性已于2005年被攻破, 也就是说,现在已经能够产生具备相同散列值的两条不同的消息。不过,SHA-2还尚未被攻破。



 

1.5.4 Go中对SHA-1、SHA-2的使用


需要导入的包:
 

 3/4   首页 上一页 1 2 3 4 下一页 尾页

  • 微信扫一扫~
  • 支付宝扫一扫~

很赞哦! ()

上一篇:非对称加密

下一篇:消息认证码

文章评论