2012-09-10 67 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