【问题标题】:How to get Resulting Disgest with WS-UsernameToken?如何使用 WS-UsernameToken 获得结果摘要?
【发布时间】:2018-05-14 17:32:23
【问题描述】:

我有来自ONVIF's Programmer Guide的以下文档

我目前正在尝试使用指南中给出的相同条目来重现 Resulting Digest...

这是我的代码:

private string GenerateHashedPassword(string nonce, string created, string password)
    {
        byte[] nonceBytes = Encoding.UTF8.GetBytes(nonce);
        byte[] createdBytes = Encoding.UTF8.GetBytes(created);
        byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
        byte[] combined = new byte[createdBytes.Length + nonce.Length + passwordBytes.Length];
        //N-C-P
        Buffer.BlockCopy(nonceBytes, 0, combined, 0, nonceBytes.Length);
        Buffer.BlockCopy(createdBytes, 0, combined, nonceBytes.Length, createdBytes.Length);
        Buffer.BlockCopy(passwordBytes, 0, combined, nonceBytes.Length + createdBytes.Length, passwordBytes.Length);

        return Convert.ToBase64String(SHA1.Create().ComputeHash(combined));
    }

当我使用我的功能时:

string digestPassword = GenerateHashedPassword("LKqI6G/AikKCQrN0zqZFlg==","2010-09-16T07:50:45Z","userpassword");//Values from guide

我的函数返回的结果与指南中的不同...

我的功能有什么问题? 为什么我不能得到相同的输出??

【问题讨论】:

    标签: c# authentication soap onvif usernametoken


    【解决方案1】:

    伪代码中的正确步骤是

    1. n = base64decode ("LKqI6G/AikKCQrN0zqZFlg==")
    2. s = sha1 (n + "2010-09-16T07:50:45Zuserpassword")
    3. resulting_digest = base64encoder (s)
    

    作为参考,中间值为:

    1. n = '\x2c\xaa\x88\xe8\x6f\xc0\x8a\x42\x82\x42\xb3\x74\xce\xa6\x45\x96'
    2. s = '\xb6\xe3\x92\xa4\x69\x45\x94\x85\xec\xa3\x3a\xb8\x1c\x53\x5e\x78x\67\x85\x2c\x42'
    

    你没有发布你得到的结果,但我认为你正在使用 sha1 散列的二进制字符串中使用 base64 编码版本的 nonce。

    【讨论】:

      【解决方案2】:

      感谢@Ottavio 的帮助,我发现在将随机数与我的其余条目进行散列之前我没有解码它...我用来获得良好结果的代码是:

      private string GenerateHashedPassword(string nonce, string created, string password)
          {
              byte[] nonceBytes = Convert.FromBase64String(nonce);
              byte[] createdAndPasswordBytes = Encoding.UTF8.GetBytes(created + password);
              byte[] combined = new byte[nonceBytes.Length + createdAndPasswordBytes.Length];
      
              Buffer.BlockCopy(nonceBytes, 0, combined, 0, nonceBytes.Length);
              Buffer.BlockCopy(createdAndPasswordBytes, 0, combined, nonceBytes.Length, createdAndPasswordBytes.Length);
      
              return Convert.ToBase64String(SHA1.Create().ComputeHash(combined));
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-28
        • 2017-06-05
        相关资源
        最近更新 更多