如何让Ogone支持使用SHA-512的字段值中的特殊字符

时间:2015-01-12 09:36:44

标签: c# unit-testing encryption sha512

我们为Ogone支付平台实施了SHA-512哈希。 这意味着我们必须散列所有FORM变量的所有值。

但是,只要某个字段有特殊字符,Ogone就不会接受Hash。付款页面将使用记录的错误进行呈现: 错误订单/ 1 / s

Ogone有一个测试页面可用于测试字符串并获得SHA512: https://secure.ogone.com/ncol/test/testsha_UTF8.asp

以下是我用于单元测试的示例。

[TestMethod]
public void EncodePaiosBajos_ResultsInExpectedSha512String()
{
  string name = "Paios Bajos";
  string result = PaymentProviderHelper.ShaEncode(name, new SHA512Managed());
  string expected = "3AC80D8A5B1AF7DF3530027269B807B097B6C770F168509ED7A8148E941AEA3369112F1B5BF1BE0965D0FE9AB83C1AB1CB7BF22DFD733E120A6A828600EFE643";
  Assert.AreEqual(expected, result);
}

[TestMethod]
public void EncodePaiosBajosSpecialCharacters_ResultsInExpectedSha512String()
{
  string name = "Países Bajos";
  string result = PaymentProviderHelper.ShaEncode(name, new SHA512Managed());
  string expected = "D4F8FFEC3FA0A3146C9611294569FF861CFF0E8C26982DA8D492DAB5D67B380558BFA0571A7D0DF49407B5075AE4DCE76253603075AF9350EA180ED32FA96026";
  Assert.AreEqual(expected, result);
}

PaymentProviderHelper.ShaEncode方法如下所示:

 internal static string ShaEncode(string signature, HashAlgorithm shaEncoding)
        {
            shaEncoding.Initialize();
            // Encode signature
            byte[] buffer = Encoding.ASCII.GetBytes(signature);
            shaEncoding.ComputeHash(buffer);

            // Return the encoded string in hexidecimal
            String returnValue = String.Empty;
            foreach (byte c in shaEncoding.Hash)
            {
                returnValue += String.Format("{0:X2}", (int)c);
            }

            return returnValue;
        }

问题:为什么第二单元测试失败?

对于特殊字符的Encode实现可能有问题吗?

测试在C#.NET 4.5

1 个答案:

答案 0 :(得分:1)

ogone的测试页面使用UTF8编码(基于URL)来产品哈希值。但在您的实现中,您使用Encoding.ASCII。只需将您的实施编码更改为Encoding.UTF8

相关问题