Класс Hash
Публичные функции
void | clear () override |
MemoryRegion | final () override |
Hash (const Hash &from) | |
MemoryRegion | hash (const MemoryRegion &array) |
Hash (const QString &type, const QString &provider=QString()) | |
QString | hashToString (const MemoryRegion &array) |
Hash & | operator= (const Hash &from) |
QString | type () const |
void | update (const char *data, int len=-1) |
void | update (const MemoryRegion &a) override |
void | update (const QByteArray &a) |
void | update (QIODevice *file) |
Публичные функции, унаследованные от QCA::Algorithm
Algorithm (const Algorithm &from) | |
void | change (const QString &type, const QString &provider) |
void | change (Provider::Context *c) |
Provider::Context * | context () |
const Provider::Context * | context () const |
Algorithm & | operator= (const Algorithm &from) |
Provider * | provider () const |
Provider::Context * | takeContext () |
QString | type () const |
Публичные функции, унаследованные от QCA::BufferedComputation
MemoryRegion | process (const MemoryRegion &a) |
Статические публичные функции
static QStringList | supportedTypes (const QString &provider=QString()) |
Дополнительные унаследованные члены
Защищённые функции, унаследованные от QCA::Algorithm
Algorithm () |
Algorithm (const QString &type, const QString &provider) |
Подробное описание
Общий класс для алгоритмов хеширования.
Hash
— это класс для различных алгоритмов
хеширования в QCA. SHA256, SHA1 или RIPEMD160 рекомендуются для новых приложений, хотя MD2, MD4, MD5
или SHA0 могут быть применимы (по причинам совместимости) для некоторых приложений.
Для выполнения хеширования необходимо создать объект
Hash
, вызвать
update()
с данными, которые необходимо хешировать, а затем вызывать
final(),
который возвращает QByteArray
результата хеширования. Пример (с использованием хэша SHA1 с 1000
обновлениями 1000-байтовой строки) показан ниже:
if(!QCA::isSupported("sha1"))
printf("SHA1 не поддерживается!\n");
else
{
QByteArray fillerString;
fillerString.fill('a', 1000);
QCA::Hash shaHash("sha1");
for (int i=0; i<1000; i++)
shaHash.update(fillerString);
QByteArray hashResult = shaHash.final();
if ( "34aa973cd4c4daa4f61eeb2bdbad27316534016f" == QCA::arrayToHex(hashResult) )
{
printf("Тест на SHA1 длинной строки успешен\n");
}
else
{
printf("Тест на SHA1 длинной строки неуспешен\n");
}
}
Если к алгоритму есть только требование использовать простой хеш (одну строку, которая одновременно
полностью доступна в памяти), тогда стоит обратить внимание на один из удобных методов. Так,
например, вместо создания объекта
QCA::Hash
, выполнения одного вызова
update()
и вызова
final();
достаточно просто вызвать
QCA::Hash("algoName").hash().
Этому методу нужно передать те же данные, что и методу
update().
Для получения дополнительной информации об алгоритмах хеширования можно ознакомиться с Алгоритмы хеширования.
Примеры
Описание конструкторов и деструктора
Hash() [1/2]
QCA::Hash::Hash (const QString & type, const QString & provider = QString() ) | explicit |
Конструктор.
Параметры
type | Метка для типа создаваемого хэша (например, "sha1" или "md2") |
provider | Имя плагина криптопровайдера для подкласса (например, "qca-ossl") |
Hash() [2/2]
QCA::Hash::Hash (const Hash & from) |
Конструктор копирования.
Параметры
from | Объект Hash для копирования |
Описание методов
operator=()
Hash& QCA::Hash::operator= (const Hash & from) |
Оператор присваивания.
Параметры
from | Объект Hash для получения состояния |
supportedTypes()
static QStringList QCA::Hash::supportedTypes (const QString & provider = QString()) | static |
Возвращает список всех доступных типов хешей.
Параметры
provider | Имя криптопровайдера, от которого нужно получить список, если требуется один криптопровайдер. Если не указан, будут возвращены доступные типы хэшей от всех криптопровайдеров |
type()
QString QCA::Hash::type () const |
Возвращает тип хеша.
clear()
void QCA::Hash::clear () | override virtual |
Сбросить хеш, сбросив все предыдущие части сообщения.
Этот метод очищает (или сбрасывает) алгоритм хеширования, эффективно отменяя все предыдущие вызовы
update().
Необходимо использовать этот вызов, если повторно используется объект подкласса
Hash
для вычисления дополнительных хэшей.
Реализует QCA::BufferedComputation.
update() [1/4]
void QCA::Hash::update (const MemoryRegion & a) | override virtual |
Обновляет хэш, добавляя в дайджест больше данных из сообщения.
Всё сообщение необходимо добавить с помощью этого метода перед вызовом final().
При использовании кода, который вызывает метод update() только один раз, лучше использовать функцию hash() или hashToString().
Параметры
a | Массив байтов для добавления к хешу |
Реализует QCA::BufferedComputation.
Примеры
update() [2/4]
void QCA::Hash::update (const QByteArray & a) |
Это перегруженная функция, предоставленная для удобства. Она отличается от указанной выше функции только тем, какие аргументы она принимает.
Параметры
a | QByteArray для добавления в хеш |
update() [3/4]
void QCA::Hash::update (const char * data, int len = -1) |
Это перегруженная функция, предоставленная для удобства. Он отличается от вышеупомянутой функции только тем, какие аргументы он принимает. Этот метод предназначен для помощи с кодом, который уже существует и переносится в QCA.
При написании нового кода, следует передать SecureArray (как показано выше).
Параметры
data | Указатель на массив символов |
len | Длина массива. Если не указано (или указано как отрицательное число), длина будет определяться с помощью strlen() , что может быть некорректным, если массив содержит нулевой символ (0x00 ) |
update() [4/4]
void QCA::Hash::update (QIODevice * file) |
Это перегруженная функция, предоставленная для удобства. Он отличается от вышеупомянутой функции только тем, какие аргументы он принимает. Этот метод позволяет читать из файла или другого устройства ввода-вывода.
Следует обратить внимание, что устройство должно быть уже открыто для чтения.
Параметры
file | Устройство ввода-вывода |
Если необходимо вычислить хэш всего файла (а он ещё не открыт), следует использовать такой код:
QFile f( "file.dat" );
if ( f.open( QIODevice::ReadOnly ) )
{
QCA::Hash hashObj("sha1");
hashObj.update( &f );
QByteArray output = hashObj.final().toByteArray();
}
final()
MemoryRegion QCA::Hash::final () | override virtual |
Завершает ввод и возвращает результат хеширования.
После вызова update() с необходимыми данными хеширование завершается и создаются результаты.
Следует обратить внимание, что невозможно добавить дополнительные данные (с помощью
update())
после вызова
final(),
из-за того, как работает хеширование — нулевые байты вставляются в результат до фиксированного
размера. Если необходимо повторно использовать объект
Hash
, нужно вызвать
clear()
и снова начать
update().
Реализует QCA::BufferedComputation.
Примеры
hash()
MemoryRegion QCA::Hash::hash (const MemoryRegion & array) |
Хеширует байтовый массив, возвращая его как другой.
Это удобный метод, который возвращает хеш SecureArray.
SecureArray sampleArray(3);
sampleArray.fill('a');
SecureArray outputArray = QCA::Hash("md2")::hash(sampleArray);
Параметры
array | QByteArray для хеширования |
Если необходима большая гибкость (например, при создании объекта большого байтового массива, чтобы
передать его в
hash()),
следует задуматься о создании объекта
Hash
с дальнейшим вызовом
update()
и
final().
hashToString()
QString QCA::Hash::hashToString (const MemoryRegion & array) |
Хешировать массив байтов, возвращая его как строку для печати.
Это удобный метод, который возвращает хэш
SecureArray в виде шестнадцатеричного
представления, закодированного в QString
.
Параметры
array | QByteArray для хеширования |
Если необходима большая гибкость, следует создать объект
Hash
, при необходимости вызвать
Hash::update(),
затем вызвать
Hash::final()
перед использованием статического метода
arrayToHex().