SHA
Функции SHA
Использовать функции очень просто:
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
Все функции SHA
В связи с тем, что в разговорной речи sha256
используется для обозначения sha2_256
, существуют вспомогательные функции, сопоставляющие вызовы функций shaxxx()
с sha2_xxx()
. Для SHA-3 подобные аналоги отсутствуют, и пользователь должен использовать полные имена sha3_xxx()
.
shaxxx()
принимает AbstractString
и массивоподобные объекты (NTuple
и Array
) с элементами типа UInt8
.
SHA-1
#
SHA.sha1
— Function
sha1(data)
Хэширует данные с помощью алгоритма sha1
и возвращает результирующий дайджест. См. также описание SHA1_CTX
.
sha1(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha1
.
SHA-2
#
SHA.sha224
— Function
sha224(data)
Хэширует данные с помощью алгоритма sha224
и возвращает результирующий дайджест. См. также описание SHA2_224_CTX
.
sha224(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha224
.
#
SHA.sha256
— Function
sha256(data)
Хэширует данные с помощью алгоритма sha256
и возвращает результирующий дайджест. См. также описание SHA2_256_CTX
.
sha256(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha256
.
#
SHA.sha384
— Function
sha384(data)
Хэширует данные с помощью алгоритма sha384
и возвращает результирующий дайджест. См. также описание SHA2_384_CTX
.
sha384(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha384
.
#
SHA.sha512
— Function
sha512(data)
Хэширует данные с помощью алгоритма sha512
и возвращает результирующий дайджест. См. также описание SHA2_512_CTX
.
sha512(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha512
.
#
SHA.sha2_224
— Function
sha2_224(data)
Хэширует данные с помощью алгоритма sha2_224
и возвращает результирующий дайджест. См. также описание SHA2_224_CTX
.
sha2_224(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha2_224
.
#
SHA.sha2_256
— Function
sha2_256(data)
Хэширует данные с помощью алгоритма sha2_256
и возвращает результирующий дайджест. См. также описание SHA2_256_CTX
.
sha2_256(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha2_256
.
#
SHA.sha2_384
— Function
sha2_384(data)
Хэширует данные с помощью алгоритма sha2_384
и возвращает результирующий дайджест. См. также описание SHA2_384_CTX
.
sha2_384(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha2_384
.
#
SHA.sha2_512
— Function
sha2_512(data)
Хэширует данные с помощью алгоритма sha2_512
и возвращает результирующий дайджест. См. также описание SHA2_512_CTX
.
sha2_512(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha2_512
.
SHA-3
#
SHA.sha3_224
— Function
sha3_224(data)
Хэширует данные с помощью алгоритма sha3_224
и возвращает результирующий дайджест. См. также описание SHA3_224_CTX
.
sha3_224(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha3_224
.
#
SHA.sha3_256
— Function
sha3_256(data)
Хэширует данные с помощью алгоритма sha3_256
и возвращает результирующий дайджест. См. также описание SHA3_256_CTX
.
sha3_256(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha3_256
.
#
SHA.sha3_384
— Function
sha3_384(data)
Хэширует данные с помощью алгоритма sha3_384
и возвращает результирующий дайджест. См. также описание SHA3_384_CTX
.
sha3_384(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha3_384
.
#
SHA.sha3_512
— Function
sha3_512(data)
Хэширует данные с помощью алгоритма sha3_512
и возвращает результирующий дайджест. См. также описание SHA3_512_CTX
.
sha3_512(io::IO)
Хэширует данные из ввода-вывода с помощью алгоритма sha3_512
.
Работа с контекстами
Для создания хэша из нескольких элементов можно использовать типы 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!
— Function
update!(context, data[, datalen])
Обновляет контекст SHA байтами в данных. Кроме того, см. описание функции digest!
, которая финализирует хэш.
Примеры
julia> ctx = SHA1_CTX()
SHA1 hash state
julia> update!(ctx, b"data to to be hashed")
#
SHA.digest!
— Function
digest!(context)
Финализирует контекст SHA и возвращает хэш как массив байтов (Array{Uint8, 1}).
Примеры
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
Все типы контекстов SHA
SHA-1
#
SHA.SHA1_CTX
— Type
SHA1_CTX()
Конструирует пустой контекст SHA1.
SHA-2
Также существуют вспомогательные типы, где SHAXXX_CTX
является псевдонимом типа для SHA2_XXX_CTX
.
#
SHA.SHA224_CTX
— Type
SHA2_224_CTX()
Конструирует пустой контекст SHA2_224.
#
SHA.SHA256_CTX
— Type
SHA2_256_CTX()
Конструирует пустой контекст SHA2_256.
#
SHA.SHA384_CTX
— Type
SHA2_384()
Конструирует пустой контекст SHA2_384.
#
SHA.SHA512_CTX
— Type
SHA2_512_CTX()
Конструирует пустой контекст SHA2_512.
#
SHA.SHA2_224_CTX
— Type
SHA2_224_CTX()
Конструирует пустой контекст SHA2_224.
#
SHA.SHA2_256_CTX
— Type
SHA2_256_CTX()
Конструирует пустой контекст SHA2_256.
#
SHA.SHA2_384_CTX
— Type
SHA2_384()
Конструирует пустой контекст SHA2_384.
#
SHA.SHA2_512_CTX
— Type
SHA2_512_CTX()
Конструирует пустой контекст SHA2_512.
SHA-3
#
SHA.SHA3_224_CTX
— Type
SHA3_224_CTX()
Конструирует пустой контекст SHA3_224.
#
SHA.SHA3_256_CTX
— Type
SHA3_256_CTX()
Конструирует пустой контекст SHA3_256.
#
SHA.SHA3_384_CTX
— Type
SHA3_384_CTX()
Конструирует пустой контекст SHA3_384.
#
SHA.SHA3_512_CTX
— Type
SHA3_512_CTX()
Конструирует пустой контекст SHA3_512.
Функции HMAC
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"
Все функции HMAC
Тип контекста HMAC
#
SHA.HMAC_CTX
— Type
HMAC_CTX(ctx::CTX, key::Vector{UInt8}) where {CTX<:SHA_CTX}
Конструирует пустой контекст HMAC_CTX.
SHA-1
#
SHA.hmac_sha1
— Function
hmac_sha1(key, data)
Хэширует данные с помощью алгоритма sha1
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha1(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha1
.
SHA-2
#
SHA.hmac_sha224
— Function
hmac_sha224(key, data)
Хэширует данные с помощью алгоритма sha224
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha224(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha224
.
#
SHA.hmac_sha256
— Function
hmac_sha256(key, data)
Хэширует данные с помощью алгоритма sha256
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha256(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha256
.
#
SHA.hmac_sha384
— Function
hmac_sha384(key, data)
Хэширует данные с помощью алгоритма sha384
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha384(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha384
.
#
SHA.hmac_sha512
— Function
hmac_sha512(key, data)
Хэширует данные с помощью алгоритма sha512
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha512(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha512
.
#
SHA.hmac_sha2_224
— Function
hmac_sha2_224(key, data)
Хэширует данные с помощью алгоритма sha2_224
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha2_224(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha2_224
.
#
SHA.hmac_sha2_256
— Function
hmac_sha2_256(key, data)
Хэширует данные с помощью алгоритма sha2_256
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha2_256(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha2_256
.
#
SHA.hmac_sha2_384
— Function
hmac_sha2_384(key, data)
Хэширует данные с помощью алгоритма sha2_384
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha2_384(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha2_384
.
#
SHA.hmac_sha2_512
— Function
hmac_sha2_512(key, data)
Хэширует данные с помощью алгоритма sha2_512
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha2_512(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha2_512
.
SHA-3
#
SHA.hmac_sha3_224
— Function
hmac_sha3_224(key, data)
Хэширует данные с помощью алгоритма sha3_224
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha3_224(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha3_224
.
#
SHA.hmac_sha3_256
— Function
hmac_sha3_256(key, data)
Хэширует данные с помощью алгоритма sha3_256
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha3_256(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha3_256
.
#
SHA.hmac_sha3_384
— Function
hmac_sha3_384(key, data)
Хэширует данные с помощью алгоритма sha3_384
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha3_384(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha3_384
.
#
SHA.hmac_sha3_512
— Function
hmac_sha3_512(key, data)
Хэширует данные с помощью алгоритма sha3_512
с использованием переданного ключа. См. также описание HMAC_CTX
.
hmac_sha3_512(key, io::IO)
Хэширует данные из io
с помощью переданного ключа с использованием алгоритма sha3_512
.