Re[2]: Digest Auth: как посчитать HA1, имея только хэш парол
От: alexr.r Украина  
Дата: 17.06.04 07:13
Оценка:
Здравствуйте, 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.