2012-09-10 108 views
2

我的工作Securepay集成与我的ASP.NET网页,按他们的文档,我从以下信息生成SHA1:Securepay支付网关整合问题

的指纹是上述领域加的SHA1哈希以该顺序与管分离器SecurePay交易密码“|”:

  1. EPS_MERCHANTID
  2. 交易密码(由SecurePay支持提供)
  3. EPS_TXNTYPE(如0)
  4. EPS_REFERENCEID(用于测试目的123)
  5. EPS_AMOUNT(用于测试目的100.00)
  6. EPS_TIMESTAMP(用于测试目的20120910203805)

虽然我按照给定的指令以上,但每当我做支付它说“无效指纹”。示例代码:

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

请您能不能告诉你的代码(带屏蔽的秘密) –

+0

好吧,这是如下:FormsAuthentication.HashPasswordForStoringInConfigFile(“XXX | XXX | 0 | 123 | 100.00 | 20120910203805 “,”sha1“)。ToLower(); –

+0

所以你用这个来创建一个散列密码来保存在配置文件中?只是问,因为文档说它适合存储在配置中。 –

回答

1

检查您是否正确结束该行,或者使用尾部“|”或删除不必要的尾部'|'。

还要检查您使用的方法是否会在方法内部添加任何会导致您所期望的内容变形的内容。 (我想基于特定机器盐你是不知道,如果它这样做或不)

我一直在试图以此来这里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; 
     } 
    } 
} 
+0

嗨,我试着用你的输入,我得到了SHA1:c09e1bf5f6c201d7dfb3574305458d48f9714a05这是不同于你的上述给定的代码 –

+0

嗨,仍然不工作与新的UTF8Encoding –

+0

请显示更多的代码,然后作为我提供的这个哈希代码工作,所以问题在于哈希呼叫之前或之后。 –

0

我同样的问题,我用下面的方法解决了这个问题:

private string GetSHA1HashData(string data) 
     { 

      SHA1 sha1 = new SHA1CryptoServiceProvider(); 

      //convert the input text to array of bytes 
      byte[] hashData = sha1.ComputeHash(Encoding.Default.GetBytes(data)); 

      //create new instance of StringBuilder to save hashed data 
      StringBuilder returnValue = new StringBuilder(); 

      //loop for each byte and add it to StringBuilder 
      for (int i = 0; i < hashData.Length; i++) 
      {     
       returnValue.Append(hashData[i].ToString("x2")); 
      } 

      // return hexadecimal string 
      return returnValue.ToString(); 
     } 

在页面加载I中将此返回值转换为小写。因为大写上述方法的返回值

string VAL="ABC|password|1|Te‌​st Reference|1.00|20120912123421"; 
fingerPrint = GetSHA1HashData(VAL); 
+1

1)默认编码当然不是正确的想法,因为它根据您运行的计算机而不同。改为使用固定编码。我希望UTF-8是最好的选择。 2)我建议从'GetSHA1HashData'中分解哈希编码。 (单一职责原则)3)'Trim'没有用处,输出中不会有任何空格。 4)可以使用'ToString(“x2”)'而不是'ToLowerInvariant'。 5)评论“创建新的MD5实例”不符合代码。 6)你应该处理'sha1'。 – CodesInChaos

+0

@CodesInChaos感谢您的信息。我改变了你提到的。但在我的情况下,我不得不使用默认编码,因为它提到使用..谢谢 – DevT