2011-11-25 63 views
1

使用SHA-1产生两个哈希字符串这里是我的Android代码的流程:比较Android中

我使用SHA-1散列散列由通过的EditText用户输入的密码。我在这里得到一个散列字符串作为输出。

之后,我调用一个使用ASCII编码执行相同SHA-1散列的SOAP Web服务(使用.NET框架创建),并返回另一个散列字符串。

现在由于输入字符串在两种情况下都是相同的,所以我的散列字符串与预期相同。 请参阅下面的logcat。但是,当我比较散串,我没有得到的结果如预期

这里之后logcat的我的Android代码:

  package com.kar.encodePassword; 
      import java.io.IOException; 
      import java.io.UnsupportedEncodingException; 
      import java.net.SocketException; 
      import java.security.MessageDigest; 
      import java.security.NoSuchAlgorithmException; 
      import org.ksoap2.SoapEnvelope; 
      import org.ksoap2.serialization.SoapObject; 
      import org.ksoap2.serialization.SoapPrimitive; 
      import org.ksoap2.serialization.SoapSerializationEnvelope; 
      import org.ksoap2.transport.HttpTransportSE; 
      import org.xmlpull.v1.XmlPullParserException; 
      import android.app.Activity; 
      import android.os.Bundle; 
      import android.util.Base64; 
      import android.util.Log; 
      import android.view.View; 
      import android.widget.Button; 
      import android.widget.EditText; 
      import android.widget.Toast; 

    public class PaswordencodingActivity extends Activity { 
     /** Called when the activity is first created. */ 

private static final String soap_action = "http://tempuri.org/HashCode"; 
private static final String method_name = "HashCode"; 
private static final String namespace2 = "http://tempuri.org/"; 
private static final String url2 = "http://10.0.2.2/checkhash/Service1.asmx"; 

String password="abc"; 
public final static int NO_OPTIONS = 0; 
String hash; 
    String result2; 


@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final EditText pass=(EditText)findViewById(R.id.editText1); 
    Button encode=(Button)findViewById(R.id.button1);    
    encode.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on click 
      password=pass.getText().toString(); 
      if(password!=null){ 
       try { 
     SHA1(password) ; 
     } catch (UnsupportedEncodingException e) {           
         e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace();      
         } 
      } 
      else{ 
     Toast.makeText(PaswordencodingActivity.this, "this is a negative onClick", Toast.LENGTH_LONG).show(); 
      } 

      } 

      }); 


     } 


private static String convertToHex(byte[] data) throws java.io.IOException 
{ 
     System.out.println("data received is" +data); 

     StringBuffer sb = new StringBuffer(); 
     String hex=null; 

     hex=Base64.encodeToString(data, 0, data.length, NO_OPTIONS); 

     for (int i = 0; i < data.length; i++) 
     {    
      if (hex.length() == 1) 
      { 
       sb.append('0'); 
      } 
      sb.append(hex); 
     } 

     return sb.toString(); 
    } 

public void SHA1(String text) throws IOException 
{ 
    MessageDigest mdSha1 = null; 
    try 
    { 
     mdSha1 = MessageDigest.getInstance("SHA-1"); 
    } catch (NoSuchAlgorithmException e1) { 
     Log.e("myapp", "Error initializing SHA1 message digest"); 
    } 
    mdSha1.update(text.getBytes("iso-8859-1"), 0, text.length()); 
    byte[] data = mdSha1.digest(); 
    hash=convertToHex(data); 

    System.out.println("data going is" +data); 
    System.out.println("hash value"+hash); 

    try 
    { 
     result2=call3(password); 
     if(result2.equalsIgnoreCase(hash.toString())) 
     System.out.println("success"); 


    } catch (XmlPullParserException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

     } 

public String call3(String pass) throws XmlPullParserException 
{ 
     String b=""; 

     SoapObject request = new SoapObject(namespace2, method_name);  
     request.addProperty("str",pass); 

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelope.dotNet = true; 
     envelope.setOutputSoapObject(request); 

     HttpTransportSE android = new HttpTransportSE(url2); 

     android.debug = true; 
try 
{ 

     android.call(soap_action, envelope); 

     SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); 
     Log.i("myapp",result.toString()); 
     System.out.println(" --- response ---- " + result); 
     b=result.toString(); 


     } catch (SocketException ex) { 
      ex.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return b; 

} 
} 

基本上当我试图比较两个哈希字符串我没有得到结果

为什么这样?谁能帮忙?

的logcat:

 11-25 17:09:50.899: INFO/System.out(275): data received is[[email protected] 
     11-25 17:09:50.909: INFO/System.out(275): data going is[[email protected] 
     11-25 17:09:50.909: INFO/System.out(275): hash valueUGGpBypVug3K+/4xONpqv9wkFd8= 
     11-25 17:09:50.909: INFO/System.out(275): UGGpBypVug3K+/4xONpqv9wkFd8= 
     11-25 17:09:50.909: INFO/System.out(275): UGGpBypVug3K+/4xONpqv9wkFd8= 
     11-25 17:09:50.909: INFO/System.out(275): UGGpBypVug3K+/4xONpqv9wkFd8= 
     11-25 17:09:50.909: INFO/System.out(275): UGGpBypVug3K+/4xONpqv9wkFd8= 
     11-25 17:09:50.909: INFO/System.out(275): UGGpBypVug3K+/4xONpqv9wkFd8= 
     11-25 17:09:50.909: INFO/System.out(275): UGGpBypVug3K+/4xONpqv9wkFd8= 
     11-25 17:09:50.909: INFO/System.out(275): UGGpBypVug3K+/4xONpqv9wkFd8= 
     11-25 17:10:01.730: INFO/myapp(275): UGGpBypVug3K+/4xONpqv9wkFd8= 
     11-25 17:10:01.730: INFO/System.out(275): --- response ---- UGGpBypVug3K+/4xONpqv9wkFd8= 

回答

1

尝试

result2 = result2.trim(); 
hash = hash.trim(); 

System.out.println("result2='" + result2 + "'"); 
System.out.println("hash ='" + hash + "'"); 

if(result2.equalsIgnoreCase(hash)) 
    System.out.println("success"); 

如果这没有帮助,检查实际阵列:

byte[] a = result.toString().getBytes() 
byte[] b = hash..getBytes(); 

如果数组不相等,你有不同的编码字符串。

+0

罚款都没有工作尝试了他们..现在告诉我如何更改编码在Android端代码..我.net网络服务是ASCII btw –

+0

我尝试在我的Android应用程序和服务器端代码都使用ASCII ..still没有适当结果:( –

+0

非常感谢帮助..它工作!:-) –

1

我认为你在错误的方式转换byte[]String,它应该是这样的:

hash = new String(data); 

而且你正在做的比较错误的,应该是这样的:

if(result2.equals(hash)) 

在我看来,你不应该转换byte[]String。使用Arrays.equals(byteArray1,byteArray2);。您的数据是随机位10 s。将它转换为String可以用很多方式完成,但它没有任何意义。

+0

对不起,我没有得到您的第一点转换哈希=新的字符串(数据);你能解释一下吗?此外,我尝试使用equals,equalsIgnoreCase和所有可能的方法进行字符串比较,但仍然没有得到结果作为“成功” –

+0

哪2个字节数组需要根据我的代码进行比较? –

1

如果对从String派生的数据应用散列算法,则需要使用相同的字符编码来检索字节。

text.getBytes("iso-8859-1") 

不同的字符集可以不同地表示字节值。

+0

好的,所以在我的服务器端我使用ASCII,所以在Android端我可以写text.getBytes(“ASCII”) –

+0

是的,你可以做到这一点。 –

+0

确定后,我该如何比较?我应该使用equalsIgnoreCase进行比较,因为@peceps提到或比较了字节数组? –