crypto SHA
SHA(Secure Hash Algorithm)系列是由美国国家安全局(NSA)设计并由国家标准与技术研究院(NIST)发布的一组密码散列函数。SHA-1、SHA-256 和 SHA-512 是其中的三种不同的算法,它们在安全性、输出长度和性能等方面有一些显著的区别。
SHA-1
SHA-1 是 SHA 系列中的一个较早版本,发布于 1993 年,并在 1995 年稍作修改。它的特点如下:
- 输出长度:160 位(20 字节)
- 安全性:由于发现了严重的安全漏洞,SHA-1 被认为不再安全,特别是对抗碰撞攻击(collision attacks)。
- 性能:相对较快,但现代应用中通常不再推荐使用。
SHA-256
SHA-256 是 SHA-2 系列中的一个成员,发布于 2001 年。它的特点如下:
- 输出长度:256 位(32 字节)
- 安全性:比 SHA-1 更安全,目前被认为在大多数应用场景中是安全的。
- 性能:相对于 SHA-1 稍慢,但仍然性能良好,适用于大多数应用。
SHA-512
SHA-512 也是 SHA-2 系列中的一个成员,发布于 2001 年。它的特点如下:
- 输出长度:512 位(64 字节)
- 安全性:比 SHA-1 和 SHA-256 更安全,适用于需要更高安全性的场景。
- 性能:由于其复杂性和更大的输出长度,相对于 SHA-256 要慢一些,但在某些 64 位系统上可能表现更好。
总结比较
| 特性 | SHA-1 | SHA-256 | SHA-512 |
|---|---|---|---|
| 输出长度 | 160 位(20 字节) | 256 位(32 字节) | 512 位(64 字节) |
| 安全性 | 不安全 | 安全 | 更安全 |
| 性能 | 快速 | 较快 | 相对较慢 |
| 发布年份 | 1993/1995 | 2001 | 2001 |
代码示例
下面是一个 Go 语言的示例代码,展示如何使用 SHA-1、SHA-256 和 SHA-512 进行哈希计算:
package main
import (
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"encoding/hex"
"fmt"
)
func main() {
data := "Hello, World!"
// SHA-1
hash1 := sha1.New()
hash1.Write([]byte(data))
hash1Result := hash1.Sum(nil)
fmt.Printf("SHA-1: %s\n", hex.EncodeToString(hash1Result))
// SHA-256
hash256 := sha256.New()
hash256.Write([]byte(data))
hash256Result := hash256.Sum(nil)
fmt.Printf("SHA-256: %s\n", hex.EncodeToString(hash256Result))
// SHA-512
hash512 := sha512.New()
hash512.Write([]byte(data))
hash512Result := hash512.Sum(nil)
fmt.Printf("SHA-512: %s\n", hex.EncodeToString(hash512Result))
}
输出示例
运行上述代码后,你将看到如下输出(具体哈希值可能会有所不同):
SHA-1: 2ef7bde608ce5404e97d5f042f95f89f1c232871
SHA-256: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b4eaa6e6b4f6bb6d1
SHA-512: 861844d6704e8573fec34d967e20bcfe6e8f8f8b7f5b1a5e4e4f1c5e5f5f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1
```json
{
"error": true,
"message": "network error"
}