Avatar billede komputerdk Mester
28. september 2010 - 07:56 Der er 6 kommentarer og
1 løsning

SHA1 med Jave2Me og PHP forskellig

Jeg har følgende nedenstående javakode
Jeg har lidt droppet at få timestamp etc. til at virke, så jeg vil kun bruge password (mitpassword) og brugernavn (brugernavn), hvor jeg kun vil lave en SHA1 på mit passwordl

Helt konkret, hvordan får jeg lavet en hash, så java og php er ens???  - for pt. er de ikke ens..

hvad jeg har kunnet læse mig til, kan det være et problem at java fjerner noget i HEX formatet - men har absolut ingen anelse om det er korrekt?


PHP

<?php
   
echo sha1("mitpasssword");
?>



java:

package Midlet;


//import java.io.*;
import java.util.Random;

import javax.microedition.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

import javax.microedition.io.Connector.*;
import javax.microedition.io.Connector.*;

import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA1Digest;

public class BilDB extends MIDlet implements CommandListener, Runnable {

  private Display mDisplay;
  private Form mForm;
  private TextField mUserField, mPasswordField;
  private Random mRandom;
  private boolean b;

  public void startApp() {
    mDisplay = Display.getDisplay(this);
    mRandom = new Random(System.currentTimeMillis());

    if (mForm == null) {
      mForm = new Form("Login");
      mUserField = new TextField("Navn", "BrugerNavn", 32, 0);
      mPasswordField = new TextField("Password", "mitpassword", 32, 0);
      mForm.append(mUserField);
      mForm.append(mPasswordField);

      mForm.addCommand(new Command("Afslut", Command.EXIT, 0));
      mForm.addCommand(new Command("Login", Command.SCREEN, 0));
      mForm.setCommandListener(this);
    }

    mDisplay.setCurrent(mForm);
  }

  public void commandAction(Command c, Displayable s) {
    if (c.getCommandType() == Command.EXIT) notifyDestroyed();
    else {
      Form waitForm = new Form("Opretter forbindelse...");
      mDisplay.setCurrent(waitForm);
      Thread t = new Thread(this);
      t.start();
    }
  }

  public void run() {
    // Indsamler de værdier vi behøver.
    long timestamp = System.currentTimeMillis();
    long randomNumber = mRandom.nextLong();
    String user = mUserField.getString();

    byte[] userBytes = user.getBytes();
    byte[] timestampBytes = getBytes(timestamp);
    byte[] randomBytes = getBytes(randomNumber);
    String password = mPasswordField.getString();
    byte[] passwordBytes = password.getBytes();

    // Opretter et "message digest".
    Digest digest = new SHA1Digest();
    // Beregner digest værdien.
  //Flemming Almhøj*** digest.update(userBytes, 0, userBytes.length);
  //Flemming Almhøj*** digest.update(timestampBytes, 0, timestampBytes.length);
  //Flemming Almhøj*** digest.update(randomBytes, 0, randomBytes.length);
    digest.update(passwordBytes, 0, passwordBytes.length);
    byte[] digestValue = new byte[digest.getDigestSize()];
    digest.doFinal(digestValue, 0);

    // Opretter et GET URL. Den hex encoded message digest værdi er
    //  inkluderet som et parameter.

    URLBuilder ub = new URLBuilder("http://m.hjemmeside.dk/tester_.php");
    ub.addParameter("user", user);
//REM***  ub.addParameter("timestamp",
//REM***      new String(HexCodec.bytesToHex(timestampBytes)));
//REM***  ub.addParameter("random",
//REM***      new String(HexCodec.bytesToHex(randomBytes)));
    ub.addParameter("digest",
        new String(HexCodec.bytesToHex(digestValue)));
    //REM***  ub.addParameter("pw",
//REM***      new String(HexCodec.bytesToHex(passwordBytes)));
ub.addParameter("pw",
        new String(passwordBytes));


    String url = ub.toString();
        try {
            //    try {
            //      HttpConnection hc = (HttpConnection)Connector.open(url);
            //      InputStream in = hc.openInputStream();
            //
            //      int length = (int)hc.getLength();
            //      byte[] raw = new byte[length];
            //      in.read(raw);
            //      String responseURL = new String(raw);
            //      in.close();
            //      hc.close();
            //
            b = platformRequest(url);
            destroyApp(true);
            notifyDestroyed();
            ////      Alert a = new Alert("Response", response, null, null);
            ////      a.setTimeout(Alert.FOREVER);
            ////      mDisplay.setCurrent(a, mForm);
            //
            //    }
            //    catch (IOException ioe) {
            //      Alert a = new Alert("Exception", ioe.toString(), null, null);
            //      a.setTimeout(Alert.FOREVER);
            //      mDisplay.setCurrent(a, mForm);
            //    }
        } catch (ConnectionNotFoundException ex) {
            ex.printStackTrace();
        }
  }

  private byte[] getBytes(long x) {
    byte[] bytes = new byte[8];
    for (int i = 0; i < 8; i++)
      bytes[i] = (byte)(x >> ((7 - i) * 8));
    return bytes;
  }

  public void pauseApp() { }

  public void destroyApp(boolean unconditional) { }
}

class URLBuilder {
  private StringBuffer mBuffer;
  private boolean mHasParameters;

  public URLBuilder(String base) {
    mBuffer = new StringBuffer(base);
    mHasParameters = false;
  }

  public void addParameter(String name, String value) {
    // Append a separator.
    if (mHasParameters == false) {
      mBuffer.append('?');
      mHasParameters = true;
    }
    else
      mBuffer.append('&');
    // Now tack on the name and value pair. These should
    //  really be URL encoded (see java.net.URLEncoder in
    //  J2SE) but this class appends the name and value
    //  as is, for simplicity. Names or values with spaces
    //  or other special characters will not work correctly.
    mBuffer.append(name);
    mBuffer.append('=');
    mBuffer.append(value);
  }

  public String toString() {
    return mBuffer.toString();
  }
}

class HexCodec {
  private static final char[] kDigits = {
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    'a', 'b', 'c', 'd', 'e', 'f'
  } ;

  public static char[] bytesToHex(byte[] raw) {
    int length = raw.length;
    char[] hex = new char[length * 2];
    for (int i = 0; i < length; i++) {
      int value = (raw[i] + 256) % 256;
      int highIndex = value >> 4;
      int lowIndex = value & 0x0f;
      hex[i * 2 + 0] = kDigits[highIndex];
      hex[i * 2 + 1] = kDigits[lowIndex];
    }
    return hex;
  }

  public static byte[] hexToBytes(char[] hex) {
    int length = hex.length / 2;
    byte[] raw = new byte[length];
    for (int i = 0; i < length; i++) {
      int high = Character.digit(hex[i * 2], 16);
      int low = Character.digit(hex[i * 2 + 1], 16);
      int value = (high << 4) | low;
      if (value > 127) value -= 256;
      raw[i] = (byte)value;
    }
    return raw;
  }

  public static byte[] hexToBytes(String hex) {
    return hexToBytes(hex.toCharArray());
  }
}
Avatar billede arne_v Ekspert
29. september 2010 - 02:52 #1
Det er meget kode at skulle overskue.

Men det kan bringes til at virke.


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA1 {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        String s = "Dette er en prøve 123!";
        System.out.println(toHex(md.digest(s.getBytes())));
    }
    private static String toHex(byte[] ba) {
        char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < ba.length; i++) {
          sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
          sb.append(hexdigit[ba[i] & 0x0F]);
        }
        return sb.toString();
    }
}



<?php
$s = 'Dette er en prøve 123!';
echo hash('sha1', $s)
?>


C:\>javac SHA1.java

C:\>java SHA1
76f6af794addbbfd589dfd5811b603b23ccf45a1

C:\>php sha1.php
76f6af794addbbfd589dfd5811b603b23ccf45a1
Avatar billede komputerdk Mester
07. oktober 2010 - 08:42 #2
Sorry det sene svar..

Netbeans kommer med en fejl med linjen:

  System.out.println(toHex(md.digest(s.getBytes())));

method digest in class java.security.MessageDigest cannot be applied to given types
  required: byte[],int,int
  found: byte[]

:(
Avatar billede arne_v Ekspert
07. oktober 2010 - 15:32 #3
hvad med:

System.out.println(toHex(md.digest(s.getBytes(), 0, s.getBytes().length)));
Avatar billede komputerdk Mester
07. oktober 2010 - 15:59 #4
arggg

method toHex in class SHA1 cannot be applied to given types
  required: byte[]
  found: int

det er da totalt mystisk..
Avatar billede arne_v Ekspert
07. oktober 2010 - 16:10 #5
Java ME maa vare lidt anderledes end SE.

proev:

md.update(s.getBytes(), 0, s.getBytes().length);
System.out.println(toHex(md.digest());
Avatar billede arne_v Ekspert
20. november 2010 - 01:20 #6
Kommet videre?
Avatar billede komputerdk Mester
28. april 2012 - 19:10 #7
jeg har givet op - java er vist ikke lige mig.. :(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester