【问题标题】:Need help creating a valid nonce需要帮助创建有效的随机数
【发布时间】:2017-08-03 21:28:26
【问题描述】:

我正在尝试使用使用密码摘要模式的 Web 服务,并且我的 Java 应用程序中有这些函数来生成随机随机数、创建日期和密码摘要。我无法通过 Authentication Failed 错误,并且文档对于他们是否需要 SHA-1 或 MD5 并不太清楚,因为它顺便提到了两者。我尝试了 MD5 而不是 SHA-1,我得到了相同的结果。我设法通过对 SoapUI 的测试使请求工作,但我不知道该应用程序是如何生成摘要/随机数的。任何帮助表示赞赏。

这是我用来生成随机数和密码摘要的代码:

    private static SOAPMessage createSOAPRequest() throws Exception 
    {
        String password = "FakePassword";

        String nonce = generateNonce(); 
        System.out.println("Nonce = " + nonce);

        DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
        Date today = Calendar.getInstance().getTime();
        String created = dateFormatter.format(today);
        System.out.println("Created = " + created);

        String passwordDigest = buildPasswordDigest(nonce, created, password);
        System.out.println("Password Digest = " + passwordDigest);
    }

    private static String buildPasswordDigest(String nonce, String created, String password) throws NoSuchAlgorithmException, UnsupportedEncodingException
    {
        MessageDigest sha1;
        String passwordDigest = null;

        try
        {
            sha1 = MessageDigest.getInstance("SHA-1");
            sha1.update(Base64.decodeBase64(nonce));
            sha1.update(created.getBytes("UTF-8"));
            passwordDigest = new String(Base64.encodeBase64(sha1.digest(password.getBytes("UTF-8"))));
            sha1.reset();
        }
        catch (NoSuchAlgorithmException e) 
        {
            e.printStackTrace();
        }

        return passwordDigest;
    }

    private static String generateNonce() throws NoSuchAlgorithmException, NoSuchProviderException, UnsupportedEncodingException
    {
        String dateTimeString = Long.toString(new Date().getTime());
        byte[] nonceByte = dateTimeString.getBytes();
        return Base64.encodeBase64String(nonceByte);
    }

【问题讨论】:

  • 这是针对哪个网络服务的?
  • 我真的不敢说 - 这是保密的......我从你在这里的回复中收集到,我应该向他们的技术团队寻求帮助,因为这种事情还不够通用获得在线帮助。但如果是,那么为什么 SoapUI 能够毫无问题地做到这一点?
  • 我真的不能说;我会和他们的技术人员谈谈。可以肯定的是,您是故意对随机数进行双重哈希处理,对吗?你得到的随机数是自纪元以来的毫秒数?
  • 实际上不,我不是故意双重哈希...我稍微更改了代码 - 修复了原始帖子。它仍然无法进行身份验证。我还确保日期时间戳采用 UTC 格式。
  • 值得一提的是,我可以使用 SoapUI 中的凭据使其正常运行 - 但是,生成的密码摘要与我获取 nonce 值、日期时间戳时得到的完全不同,和未加密的密码连接,然后通过 MD5 算法运行它们。 SHA-1 相同 - 结果完全不同。

标签: java web-services soap digest wsse


【解决方案1】:

解决方案是将sha1.update(nonce.getBytes("UTF-8")); 替换为sha1.update(Base64.decodeBase64(nonce));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2013-12-08
    • 2014-11-30
    • 1970-01-01
    • 2020-03-06
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多