【问题标题】:Generating an ONVIF authentication digest using Crypto++?使用 Crypto++ 生成 ONVIF 身份验证摘要?
【发布时间】:2016-10-17 18:23:49
【问题描述】:

ONVIF 身份验证规范第 6.1.1.3 节对如何生成摘要进行了直截了当的描述。但是,当使用 Crypto++ 进行 Base64 和 SHA1 操作时,我无法生成与规范相同的哈希值。我一定做错了什么,但看不到什么。

std::string nonce = "LKqI6G/AikKCQrN0zqZFlg==";
std::string dt = "2010-09-16T07:50:45Z";
std::string pwd = "userpassword";

{
    // result should be tuOSpGlFlIXsozq4HFNeeGeFLEI=
    // as per spec. This approach is also used here:
    // https://github.com/agsh/onvif/blob/master/lib/cam.js

    CryptoPP::Base64Decoder decoder;
    decoder.Put((byte*)nonce.data(), nonce.size());
    std::vector<uint8_t> bytes(decoder.MaxRetrievable(),0);
    decoder.Get(&bytes[0],bytes.size());

    //
    CryptoPP::SHA1 hash;
    byte digest[CryptoPP::SHA1::DIGESTSIZE];
    hash.Update(bytes.data(), bytes.size());
    hash.Update((const byte*)dt.c_str(), dt.size());
    hash.Update((const byte*)pwd.c_str(), pwd.size());
    hash.Final(digest);

    CryptoPP::Base64Encoder encoder;
    encoder.Put(digest, CryptoPP::SHA1::DIGESTSIZE);
    std::string hash64(encoder.MaxRetrievable(), 0);
    encoder.Get((byte*)hash64.data(), hash64.size());
    // generates woEIuU+ryXxcwkTZ9ktbKGeQ
    std::cout << hash64 << std::endl;
}

非常感谢您对此的任何想法。

[编辑:删除 C# 引用]

【问题讨论】:

    标签: c++ crypto++ onvif


    【解决方案1】:
    CryptoPP::Base64Decoder decoder;
    decoder.Put((byte*)nonce.data(), nonce.size());
    std::vector<uint8_t> bytes(decoder.MaxRetrievable(),0);
    decoder.Get(&bytes[0],bytes.size());
    

    致电MessageEnd:

    Base64Decoder decoder;
    decoder.Put((byte*)nonce.data(), nonce.size());
    decoder.MessageEnd();
    
    vector<uint8_t> bytes(decoder.MaxRetrievable(),0);
    decoder.Get(&bytes[0],bytes.size());
    

    同上:

    Base64Encoder encoder;
    encoder.Put(digest, 20);
    encoder.MessageEnd();
    
    string hash64(encoder.MaxRetrievable(), 0);
    encoder.Get((byte*)hash64.data(), hash64.size());
    

    另请参阅 Crypto++ wiki 上的 Base64Encoder | Missing DataBase64Decoder | Missing Data


    我也确实不能使用任何其他方法复制结果,例如使用所有 .NET 加密资源的完整 C# 测试台。

    我不知道 C# 以及 Crypto++,所以我无法提供一个 C# 示例,该示例可以按预期使用 ONVIF 身份验证。


    这是我得到的结果:

    $ g++ test.cxx -I. ./libcryptopp.a -o test.exe
    $ ./test.exe 
    tuOSpGlFlIXsozq4HFNeeGeFLEI=
    

    还有cat test.cxx

    #include <iostream>
    #include <string>
    #include <vector>
    
    #include "base64.h"
    #include "sha.h"
    
    std::string nonce = "LKqI6G/AikKCQrN0zqZFlg==";
    std::string dt = "2010-09-16T07:50:45Z";
    std::string pwd = "userpassword";
    
    int main(int argc, char* argv[])
    {
        CryptoPP::Base64Decoder decoder;
        decoder.Put((byte*)nonce.data(), nonce.size());
        decoder.MessageEnd();    
        std::vector<uint8_t> bytes(decoder.MaxRetrievable(),0);
        decoder.Get(&bytes[0],bytes.size());
    
        CryptoPP::SHA1 hash;
        byte digest[CryptoPP::SHA1::DIGESTSIZE];
        hash.Update(bytes.data(), bytes.size());
        hash.Update((const byte*)dt.c_str(), dt.size());
        hash.Update((const byte*)pwd.c_str(), pwd.size());
        hash.Final(digest);
    
        CryptoPP::Base64Encoder encoder;
        encoder.Put(digest, 20);
        encoder.MessageEnd();    
        std::string hash64(encoder.MaxRetrievable(), 0);
        encoder.Get((byte*)hash64.data(), hash64.size());
    
        std::cout << hash64 << std::endl;
    
        return 0;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多