SHA
SHA functions
使用非常简单:
julia> using SHA
julia> bytes2hex(sha256("test"))
"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
每个导出的函数(在撰写本文时,已实现 SHA-1、SHA-2 224、256、384 和 512,以及 SHA-3 224、256、384 和 512 函数)接受一个 AbstractVector{UInt8}
、一个 AbstractString
或一个 IO
对象。这使得对文件进行校验和计算变得简单:
shell> cat /tmp/test.txt
test
julia> using SHA
julia> open("/tmp/test.txt") do f
sha2_256(f)
end
32-element Array{UInt8,1}:
0x9f
0x86
0xd0
0x81
0x88
0x4c
0x7d
0x65
⋮
0x5d
0x6c
0x15
0xb0
0xf0
0x0a
0x08
All SHA functions
由于口语中将 sha256
用作 sha2_256
的代称,因此提供了便利函数,将 shaxxx()
函数调用映射到 sha2_xxx()
。对于 SHA-3,没有这样的口语用法,用户必须使用完整的 sha3_xxx()
名称。
shaxxx()
接受 AbstractString
和数组类型对象(NTuple
和 Array
),其元素类型为 UInt8
。
SHA-1
SHA.sha1
— Functionsha1(data)
使用 sha1
算法对数据进行哈希并返回结果摘要。另见 SHA1_CTX
。
sha1(io::IO)
使用 sha1
算法对 io 中的数据进行哈希。
SHA-2
SHA.sha224
— Functionsha224(data)
使用 sha224
算法对数据进行哈希并返回结果摘要。另见 SHA2_224_CTX
。
sha224(io::IO)
使用 sha224
算法对 io 中的数据进行哈希。
SHA.sha256
— Functionsha256(data)
使用 sha256
算法对数据进行哈希并返回结果摘要。另见 SHA2_256_CTX
。
sha256(io::IO)
使用 sha256
算法对 io 中的数据进行哈希。
SHA.sha384
— Functionsha384(data)
使用 sha384
算法对数据进行哈希,并返回结果摘要。另见 SHA2_384_CTX
。
sha384(io::IO)
使用 sha384
算法对 io 中的数据进行哈希。
SHA.sha512
— Functionsha512(data)
使用 sha512
算法对数据进行哈希并返回结果摘要。另见 SHA2_512_CTX
。
sha512(io::IO)
使用 sha512
算法对 io 中的数据进行哈希。
SHA.sha2_224
— Functionsha2_224(data)
使用 sha2_224
算法对数据进行哈希并返回结果摘要。另见 SHA2_224_CTX
。
sha2_224(io::IO)
使用 sha2_224
算法对 io 中的数据进行哈希。
SHA.sha2_256
— Functionsha2_256(data)
使用 sha2_256
算法对数据进行哈希并返回结果摘要。另见 SHA2_256_CTX
。
sha2_256(io::IO)
使用 sha2_256
算法对 io 中的数据进行哈希。
SHA.sha2_384
— Functionsha2_384(data)
使用 sha2_384
算法对数据进行哈希并返回结果摘要。另见 SHA2_384_CTX
。
sha2_384(io::IO)
使用 sha2_384
算法对 io 中的数据进行哈希。
SHA.sha2_512
— Functionsha2_512(data)
使用 sha2_512
算法对数据进行哈希并返回结果摘要。另见 SHA2_512_CTX
。
sha2_512(io::IO)
使用 sha2_512
算法对 io 中的数据进行哈希。
SHA-3
SHA.sha3_224
— Functionsha3_224(data)
使用 sha3_224
算法对数据进行哈希,并返回结果摘要。另见 SHA3_224_CTX
。
sha3_224(io::IO)
使用 sha3_224
算法对 io 中的数据进行哈希。
SHA.sha3_256
— Functionsha3_256(data)
使用 sha3_256
算法对数据进行哈希并返回结果摘要。另见 SHA3_256_CTX
。
sha3_256(io::IO)
使用 sha3_256
算法对 io 中的数据进行哈希。
SHA.sha3_384
— Functionsha3_384(data)
使用 sha3_384
算法对数据进行哈希并返回结果摘要。另见 SHA3_384_CTX
。
sha3_384(io::IO)
使用 sha3_384
算法对 io 中的数据进行哈希。
SHA.sha3_512
— Functionsha3_512(data)
使用 sha3_512
算法对数据进行哈希并返回结果摘要。另见 SHA3_512_CTX
。
sha3_512(io::IO)
使用 sha3_512
算法对 io 中的数据进行哈希。
Working with context
要从多个项目创建哈希,可以使用 SHAX_XXX_CTX()
类型来创建一个有状态的哈希对象,该对象可以通过 update!
更新,并通过 digest!
完成。
julia> using SHA
julia> ctx = SHA2_256_CTX()
SHA2 256-bit hash state
julia> update!(ctx, b"some data")
0x0000000000000009
julia> update!(ctx, b"some more data")
0x0000000000000017
julia> digest!(ctx)
32-element Vector{UInt8}:
0xbe
0xcf
0x23
0xda
0xaf
0x02
0xf7
0xa3
0x57
0x92
⋮
0x89
0x4f
0x59
0xd8
0xb3
0xb4
0x81
0x8b
0xc5
请注意,在撰写本文时,SHA3 代码尚未优化,因此其速度大约比 SHA2 慢一个数量级。
SHA.update!
— Functionupdate!(context, data[, datalen])
使用数据中的字节更新SHA上下文。另请参见digest!
以完成哈希。
示例
julia> ctx = SHA1_CTX()
SHA1哈希状态
julia> update!(ctx, b"待哈希的数据")
SHA.digest!
— Functiondigest!(context)
最终化 SHA 上下文并返回哈希作为字节数组 (Array{Uint8, 1})。在调用 digest!
后更新上下文将会报错。
示例
julia> ctx = SHA1_CTX()
SHA1 hash state
julia> update!(ctx, b"data to to be hashed")
julia> digest!(ctx)
20-element Array{UInt8,1}:
0x83
0xe4
⋮
0x89
0xf5
julia> update!(ctx, b"more data")
ERROR: Cannot update CTX after `digest!` has been called on it
[...]
All SHA context types
SHA-1
SHA.SHA1_CTX
— TypeSHA1_CTX()
构造一个空的 SHA1 上下文。
SHA-2
便利类型也提供,其中 SHAXXX_CTX
是 SHA2_XXX_CTX
的类型别名。
SHA.SHA224_CTX
— TypeSHA2_224_CTX()
构造一个空的 SHA2_224 上下文。
SHA.SHA256_CTX
— TypeSHA2_256_CTX()
构造一个空的 SHA2_256 上下文。
SHA.SHA384_CTX
— TypeSHA2_384()
构造一个空的 SHA2_384 上下文。
SHA.SHA512_CTX
— TypeSHA2_512_CTX()
构造一个空的 SHA2_512 上下文。
SHA.SHA2_224_CTX
— TypeSHA2_224_CTX()
构造一个空的 SHA2_224 上下文。
SHA.SHA2_256_CTX
— TypeSHA2_256_CTX()
构造一个空的 SHA2_256 上下文。
SHA.SHA2_384_CTX
— TypeSHA2_384()
构造一个空的 SHA2_384 上下文。
SHA.SHA2_512_CTX
— TypeSHA2_512_CTX()
构造一个空的 SHA2_512 上下文。
SHA-3
SHA.SHA3_224_CTX
— TypeSHA3_224_CTX()
构造一个空的 SHA3_224 上下文。
SHA.SHA3_256_CTX
— TypeSHA3_256_CTX()
构造一个空的 SHA3_256 上下文。
SHA.SHA3_384_CTX
— TypeSHA3_384_CTX()
构造一个空的 SHA3_384 上下文。
SHA.SHA3_512_CTX
— TypeSHA3_512_CTX()
构造一个空的 SHA3_512 上下文。
HMAC functions
julia> using SHA
julia> key = collect(codeunits("key_string"))
10-element Vector{UInt8}:
0x6b
0x65
0x79
0x5f
0x73
0x74
0x72
0x69
0x6e
0x67
julia> bytes2hex(hmac_sha3_256(key, "test-message"))
"bc49a6f2aa29b27ee5ed1e944edd7f3d153e8a01535d98b5e24dac9a589a6248"
要从多个项目创建哈希,可以使用 HMAC_CTX()
类型来创建一个有状态的哈希对象,该对象可以通过 update!
更新,并通过 digest!
完成。
julia> using SHA
julia> key = collect(codeunits("key_string"))
10-element Vector{UInt8}:
0x6b
0x65
0x79
0x5f
0x73
0x74
0x72
0x69
0x6e
0x67
julia> ctx = HMAC_CTX(SHA3_256_CTX(), key);
julia> update!(ctx, b"test-")
0x0000000000000000000000000000008d
julia> update!(ctx, b"message")
0x00000000000000000000000000000094
julia> bytes2hex(digest!(ctx))
"bc49a6f2aa29b27ee5ed1e944edd7f3d153e8a01535d98b5e24dac9a589a6248"
All HMAC functions
HMAC 上下文类型
SHA.HMAC_CTX
— TypeHMAC_CTX(ctx::CTX, key::Vector{UInt8}) where {CTX<:SHA_CTX}
构造一个空的 HMAC_CTX 上下文。
SHA-1
SHA.hmac_sha1
— Functionhmac_sha1(key, data)
使用传递的密钥通过 sha1
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha1(key, io::IO)
使用传递的密钥通过 sha1
算法对 io
中的数据进行哈希。
SHA-2
SHA.hmac_sha224
— Functionhmac_sha224(key, data)
使用传递的密钥通过 sha224
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha224(key, io::IO)
使用传递的密钥通过 sha224
算法对 io
中的数据进行哈希。
SHA.hmac_sha256
— Functionhmac_sha256(key, data)
使用传递的密钥通过 sha256
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha256(key, io::IO)
使用传递的密钥通过 sha256
算法对 io
中的数据进行哈希。
SHA.hmac_sha384
— Functionhmac_sha384(key, data)
使用传递的密钥通过 sha384
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha384(key, io::IO)
使用传递的密钥通过 sha384
算法对 io
中的数据进行哈希。
SHA.hmac_sha512
— Functionhmac_sha512(key, data)
使用传递的密钥通过 sha512
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha512(key, io::IO)
使用传递的密钥通过 sha512
算法对 io
中的数据进行哈希。
SHA.hmac_sha2_224
— Functionhmac_sha2_224(key, data)
使用传递的密钥通过 sha2_224
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha2_224(key, io::IO)
使用传递的密钥通过 sha2_224
算法对来自 io
的数据进行哈希。
SHA.hmac_sha2_256
— Functionhmac_sha2_256(key, data)
使用传递的密钥通过 sha2_256
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha2_256(key, io::IO)
使用传递的密钥通过 sha2_256
算法对 io
中的数据进行哈希。
SHA.hmac_sha2_384
— Functionhmac_sha2_384(key, data)
使用传递的密钥通过 sha2_384
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha2_384(key, io::IO)
使用传递的密钥通过 sha2_384
算法对来自 io
的数据进行哈希。
SHA.hmac_sha2_512
— Functionhmac_sha2_512(key, data)
使用传递的密钥通过 sha2_512
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha2_512(key, io::IO)
使用传递的密钥通过 sha2_512
算法对 io
中的数据进行哈希。
SHA-3
SHA.hmac_sha3_224
— Functionhmac_sha3_224(key, data)
使用传递的密钥通过 sha3_224
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha3_224(key, io::IO)
使用传递的密钥通过 sha3_224
算法对来自 io
的数据进行哈希。
SHA.hmac_sha3_256
— Functionhmac_sha3_256(key, data)
使用传递的密钥通过 sha3_256
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha3_256(key, io::IO)
使用传递的密钥通过 sha3_256
算法对来自 io
的数据进行哈希。
SHA.hmac_sha3_384
— Functionhmac_sha3_384(key, data)
使用传递的密钥通过 sha3_384
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha3_384(key, io::IO)
使用传递的密钥通过 sha3_384
算法对来自 io
的数据进行哈希。
SHA.hmac_sha3_512
— Functionhmac_sha3_512(key, data)
使用传递的密钥通过 sha3_512
算法对数据进行哈希。另见 HMAC_CTX
。
hmac_sha3_512(key, io::IO)
使用传递的密钥通过 sha3_512
算法对 io
中的数据进行哈希。