Go语言实现加密算法(青训营第八课)| 青训营

74 阅读4分钟

前言

加密算法一直是非常常用的算法,以SHA-1和SH-256为例,文件传输和存储中,SHA-1 和 SHA-256 用于生成文件的校验和或哈希值,以确保文件的完整性。文件传输和存储中,SHA-1 和 SHA-256 用于生成文件的校验和或哈希值,以确保文件的完整性。区块链中的加密算法通常使用 SHA-256 来创建区块的哈希值,以确保区块链的不可篡改性。

因此,借此青训营为契机,用Go语言实现一下SHA256算法,并且与Java的实现方式进行对比

Go

实现

在Go语言中,我们一般使用标准库中的 crypto/sha256 包来实现 SHA-256 哈希算法

首先,我们假设我们的输入,即需要加密的数据data,如果我们在区块链应用场景下,则一般是来加密区块头,所以,假设我们的data为:Pre=0000018f3729b0963409f29cdcf29a1aa7e1ae0d72604b206d1001826c048eac,Height=1,-> Cao : 50,Nonce=123

那么,我们需要创建一个SHA256对象,然后将需要写入的数据写入,此时可能会报错,然后,就可以进行哈希值的计算,代码如下:

image.png

但是,需要注意的是,SHA256我们一般用的是十六进制表示,所以还需要一步进制转换hashString := hex.EncodeToString(hashBytes),然后,就可以进行结果展示啦:

Original Data: Pre=0000018f3729b0963409f29cdcf29a1aa7e1ae0d72604b206d1001826c048eac,Height=1,-> Cao : 50,Nonce=123
SHA-256 Hash: 1547f73d96f951bd9b945921b6a5d8740694ffabe69b196d9c64651cece9c650

应用

那么,在Go语言的具体应用场景下,可以怎么使用SHA256呢?

SHA-256(Secure Hash Algorithm 256-bit)是一种加密哈希函数,常用于数据完整性校验、密码存储和数字签名等领域

我来举一个用SHA256来进行登录验证的例子,在上述代码的基础上,我们可以进行进一步加工。这里我想先提一下“加盐”这个操作,在加密哈希密码时,加盐是一种重要的安全措施,用于增加密码哈希的安全性。加盐是指在用户密码之前或之后添加一个随机生成的字符串,然后再计算哈希值。这个随机字符串被称为“盐”,并且每个用户都应该有一个不同的盐

我们这里的示例比较简单,盐可以直接用Go自带的随机数进行生成,代码如下:

image.png

假设我们输入了密码password,那么,我们首先将其和盐进行拼接,然后加密后保存在本地,代码如下:

image.png

我们在尝试进行登录时,输入新的密码attempt,将该密码同样进行SHA256加密,然后比较加密后的结果。但是,这个时候肯定就有疑问了,盐该进行什么操作呢?在实际操作中,盐通常与用户的唯一标识符相关联,以确保每个用户有不同的盐。在验证密码时,需要存储用户的盐,并将其与用户输入的密码一起用于计算哈希值,然后将计算的哈希值与存储的哈希值进行比较。

Java

我还想简单提一下Java实现SHA256的方式,来和Go语言的方式进行一个对比,在Java中,我们一般通过security包中的方式进行实现

实现方式大体和Go类似,都是定义好输入数据,然后将输入数据转化为byte[]组,进行加密后,再转换为十六进制形式,核心代码如下:

image.png

总结

SHA-256(Secure Hash Algorithm 256-bit)是一种密码学哈希函数,通常用于计算数据的哈希值,以便验证数据的完整性和安全性。SHA-256 生成的哈希值通常为 256 位二进制数字,表示为 64 个十六进制字符

在任何语言中都可以实现,但是Go 示例更为简洁,部分原因是 Go 语言在标准库中提供了更简单的哈希计算方式。我想,这大概率就是Go语言简洁高效魅力的一个体现吧