我正在与我的ASP.NET网页进行Securepay集成,根据他们的文档,我正在从以下信息中生成SHA1:

指纹是上述字段的SHA1哈希,再加上带有管道分隔符“ |”的SecurePay交易密码,其顺序为:


EPS_MERCHANTID
交易密码(由SecurePay支持人员提供)
EPS_TXNTYPE(为0)
EPS_REFERENCEID(用于测试目的123)
EPS_AMOUNT(用于测试目的100.00)
EPS_TIMESTAMP(用于测试目的20120910203805)


尽管我已经按照上述说明进行操作,但是每当我付款时,它都会显示“ Invalid Fingerprint”。示例代码:

FormsAuthentication
  .HashPasswordForStoringInConfigFile("xxx|xxx|0|123|100.00|201‌20910203805","sha1")
  .ToLower();`

最佳答案

检查您是否正确地结束了行,可以在行尾加上“ |”或删除不必要的尾随“ |”。

还要检查您使用的方法是否在方法内没有添加任何其他东西,这些东西会扭曲您的期望。 (我在考虑基于您所使用的特定计算机的盐,不知道它是否这样做)

我一直在尝试使用此方法在http://shagenerator.com/处生成哈希:

ABC|password|1|Te‌​st Reference|1.00|20120912123421


给出:

25a1804285bafc078f45e41056bcdc42e0508b6f


您可以使用我的输入获得与您的代码相同的密钥吗?

更新:

您可以尝试使用此方法代替HashPasswordForStoringInConfigFile()来看看是否更近:

private string GetSHA1String(string text)
{
    var UE = new UnicodeEncoding();
    var message = UE.GetBytes(text);

    var hashString = new SHA1Managed();
    var hex = string.Empty;

    var hashValue = hashString.ComputeHash(message);
    foreach (byte b in hashValue)
    {
        hex += String.Format("{0:x2}", b);
    }

    return hex;
}


更新2:

检查您的编码,我发现我可以将哈希输出与:

var UE = new UTF8Encoding();


更新3:

以下代码在控制台应用程序中为我工作,我看到哈希值生成相同的值,并且还能够将输出与http://shagenerator.com/进行比较:

using System;
using System.Security.Cryptography;
using System.Text;
using System.Web.Security;

namespace SecurepayPaymentGatewayIntegrationIssue
{
    class Program
    {
        static void Main(string[] args)
        {
            var text = @"ABC|password|1|Te‌​st Reference|1.00|20120912123421";
            Console.WriteLine(GetSHA1String(text));

            Console.WriteLine(FormsAuthentication.HashPasswordForStoringInConfigFile(text, "sha1").ToLower());

            Console.ReadKey();
        }

        private static string GetSHA1String(string text)
        {
            var UE = new UTF8Encoding();// ASCIIEncoding(); // UnicodeEncoding();
            var message = UE.GetBytes(text);

            var hashString = new SHA1Managed();
            var hex = string.Empty;

            var hashValue = hashString.ComputeHash(message);
            foreach (byte b in hashValue)
            {
                hex += String.Format("{0:x2}", b);
            }

            return hex;
        }
    }
}

10-08 16:22