2011-12-06 30 views
5

Tôi cố gắng để tạo ra một chuỗi MD5 băm android để bằng mã C# dưới đây:Android: Cách tạo chuỗi HMAC MD5?

private string CalculateHMACMd5(string message, string key) 
{ 
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
    byte[] keyByte = encoding.GetBytes(key); 
    HMACMD5 hmacmd5 = new HMACMD5(keyByte); 
    byte[] messageBytes = encoding.GetBytes(message); 
    byte[] hashmessage = hmacmd5.ComputeHash(messageBytes); 
    string HMACMd5Value = ByteToString(hashmessage); 
    return HMACMd5Value; 
} 

private static string ByteToString(byte[] buff) 
{ 
    string sbinary = ""; 
    for (int i = 0; i < buff.Length; i++) 
    { 
     sbinary += buff[i].ToString("X2"); 
    } 
    return (sbinary); 
} 


mã Android mà tôi hiện đang sử dụng [ không tạo ra cùng mã C#]:

 public static String sStringToHMACMD5(String sData, String sKey) 
     { 
      SecretKeySpec key; 
      byte[] bytes; 
      String sEncodedString = null; 
      try 
      {  
       key = new SecretKeySpec((sKey).getBytes(), "ASCII"); 
       Mac mac = Mac.getInstance("HMACMD5"); 
       mac.init(key); 
       mac.update(sData.getBytes()); 

       bytes = mac.doFinal(sData.getBytes()); 
       StringBuffer hash = new StringBuffer(); 

       for (int i=0; i<bytes.length; i++) { 
        String hex = Integer.toHexString(0xFF & bytes[i]); 
        if (hex.length() == 1) { 
         hash.append('0'); 
        } 
        hash.append(hex); 
       } 
      sEncodedString = hash.  
      return sEncodedString; 
     } 

Xin cảm ơn trước.

+0

kiểm tra mã Android. – Basbous

+0

bản sao có thể có của [Cách tạo HMAC MD5 trong Android?] (Http://stackoverflow.com/questions/3140650/how-to-generate-hmac-md5-in-android) – Thilo

+1

@Thilo: Tôi đã kiểm tra liên kết bạn cung cấp bản thân của tôi, giải pháp không hoạt động. –

Trả lời

6

Xác định 'không hoạt động'. Ngoại lệ? Đầu ra không như mong đợi ?, vv

Một điều rõ ràng là bạn đang xử lý dữ liệu cùng một hai lần:

mac.update(sData.getBytes()); 
bytes = mac.doFinal(sData.getBytes()); 

Để xử lý tất cả các dữ liệu trong một vượt qua, chỉ cần sử dụng doFinal() (giả sử nó không quá lớn) . Một điều khác có thể sai là định dạng của khóa: định dạng của String sKey là gì. Lý tưởng nhất là bạn nên sử dụng chuỗi được mã hóa BASE64, không được gọi đến getString().

+0

Tôi thấy quan điểm của bạn là chính xác, hãy kiểm tra giải pháp của tôi, cảm ơn gợi ý. – Basbous

+0

Dump (hoặc sử dụng trình gỡ lỗi) trong cả hai chương trình của byte byte [] keyByte', đảm bảo các byte giống nhau. Làm tương tự với 'byte [] messageBytes'. Nếu tất cả các đối sánh đó, 'hashessage' byte cũng nên, nhưng hãy kiểm tra điều đó. Nếu những trận đấu đó, lỗi nằm trong phần mã hóa hex cuối cùng. –

15
public static String sStringToHMACMD5(String s, String keyString) 
    { 
     String sEncodedString = null; 
     try 
     { 
      SecretKeySpec key = new SecretKeySpec((keyString).getBytes("UTF-8"), "HmacMD5"); 
      Mac mac = Mac.getInstance("HmacMD5"); 
      mac.init(key); 

      byte[] bytes = mac.doFinal(s.getBytes("ASCII")); 

      StringBuffer hash = new StringBuffer(); 

      for (int i=0; i<bytes.length; i++) { 
       String hex = Integer.toHexString(0xFF & bytes[i]); 
       if (hex.length() == 1) { 
        hash.append('0'); 
       } 
       hash.append(hex); 
      } 
      sEncodedString = hash.toString(); 
     } 
     catch (UnsupportedEncodingException e) {} 
     catch(InvalidKeyException e){} 
     catch (NoSuchAlgorithmException e) {} 
     return sEncodedString ; 
    } 
+0

Đừng bỏ qua các ngoại lệ. Đăng nhập chúng. – siamii

+0

chắc chắn nhưng tôi loại bỏ Ngoại lệ để giảm mã ở trên. – Basbous

Các vấn đề liên quan