Хотелось бы сохранять пароль для последующей автоматической аутентификации в виде хэша. Но для digest аутентификации функция посчета HA1 использует строковый пароль:
A1 = username-value ":" realm-value ":" passwd
HA1 = HASH(A1)
Может есть способ посчитать HA1 имея HASH(paswd)
В реализации MD5 я не нашел (или не понял), как добавить существующий hash
сенкс
Здравствуйте, alexr.r, Вы писали:
AR>Хотелось бы сохранять пароль для последующей автоматической аутентификации в виде хэша. Но для digest аутентификации функция посчета HA1 использует строковый пароль:
AR>A1 = username-value ":" realm-value ":" passwd
AR>HA1 = HASH(A1)
AR>Может есть способ посчитать HA1 имея HASH(paswd)
AR>В реализации MD5 я не нашел (или не понял), как добавить существующий hash
AR>
AR>сенкс
если у тебя OpenSSL то в можно обойтись хаком: проставить A B C D в то что у тебя в подписи (4 u_int32_t = 16 bytes). Если это какой-нить CryptoAPI, то фиг знает... но для твоих задач можно и OpenSSL попользовать...
Здравствуйте, aka50, Вы писали:
A>Здравствуйте, alexr.r, Вы писали:
AR>>Хотелось бы сохранять пароль для последующей автоматической аутентификации в виде хэша. Но для digest аутентификации функция посчета HA1 использует строковый пароль:
AR>>A1 = username-value ":" realm-value ":" passwd
AR>>HA1 = HASH(A1)
AR>>Может есть способ посчитать HA1 имея HASH(paswd)
AR>>В реализации MD5 я не нашел (или не понял), как добавить существующий hash
AR>>
AR>>сенкс
A>если у тебя OpenSSL то в можно обойтись хаком: проставить A B C D в то что у тебя в подписи (4 u_int32_t = 16 bytes). Если это какой-нить CryptoAPI, то фиг знает... но для твоих задач можно и OpenSSL попользовать...
Спасибо. Хотя, честно говоря, не понял — я не использую OpenSSL —
у меня есть код digest аутентификации, вот кусок расчета HA1:
CStringA ADigestAuthField::calcHA1(CStringA password)
{
HASH ha1;
CMD5Checksum md5;
md5.Update(this->fUsername.GetString(), this->fUsername.GetLength());
md5.Update(":", 1);
md5.Update(this->fRealm.GetString(), this->fRealm.GetLength());
md5.Update(":", 1);
md5.Update(password.GetString(), password.GetLength()); // вот сдесь включается строковый пароль
memcpy(ha1, md5.Final(), HASHLEN);
if (this->fAlgorithm == sip::alMD5Sess)
{
CMD5Checksum md5;
md5.Update(ha1, HASHLEN);
md5.Update(":", 1);
md5.Update(this->fNonce.GetString(), this->fNonce.GetLength());
md5.Update(":", 1);
md5.Update(this->fCnonce.GetString(), this->fCnonce.GetLength());
memcpy(ha1, md5.Final(), HASHLEN);
}
return hash2hex(ha1);
}
CStringA hash2hex(HASH h)
{
CStringA hex;
hex.Format("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7],
h[8], h[9], h[10], h[11], h[12], h[13], h[14], h[15]);
return hex;
}
Здравствуйте, alexr.r, Вы писали:
AR>Спасибо. Хотя, честно говоря, не понял — я не использую OpenSSL —
AR>у меня есть код digest аутентификации, вот кусок расчета HA1:
AR>CStringA ADigestAuthField::calcHA1(CStringA password)
AR>{
AR> HASH ha1;
AR> CMD5Checksum md5;
Вот CMD5Checksum в этом классе есть (должны быть) его внутренне состояние, 4-е переменные A B C D. Дык вот, они скорее всего приватные.
Но если ты сможешь их утсановить в нужные значения, это и будет твоя стартовая позиция.