2014-07-08 2 views
0

내가 작업하고있는 응용 프로그램은 String이 SHA-256 해시로 변환되어야하지만 J2ME 이후로는 MessageDigest 전체 기능에 액세스 할 수 없기 때문에문자열을 J2ME에서 SHA-256 해시로 변환하는 방법은 무엇입니까?

BouncyCastle 라이브러리를 사용해 보았습니다.하지만 결과 페이지를 온라인 결과와 비교할 때 값이 다릅니다.

해시가 제대로 작성되지 않았다는 것을 알 수있는 또 다른 방법은 HTTP 요청에서 내 서버로 전송하는 것입니다. 그러면 로그인 할 수 있으면 해시가 올바르게 생성되고 그렇지 않으면 조작 된 것입니다.

나는 내 자신의 SHA-256 enconding을 구현해야한다고 들었다. 그러나 지금까지는 예제 나 알고리즘 자체를 찾지 못했고, Wikipedia page의 의사 코드 만이 나왔고 더 나에게는 암호화 경험이 없다. 모든.

나만의 구현을 만들어야합니까? 아니면 여전히 이것을 피하고 다른 라이브러리를 사용할 기회가 있습니까?

  String[] stringArray = (String[]) dotREZApi.getCurrentRequest().getResponseHeaders().get("X-Session-Id"); 
      String tmpSessionId = stringArray[0]; 

      byte[] input = null; 
      try { 
       input = new String("X-Session-Sig" + tmpSessionId + "test").getBytes("UTF-8"); // String that will be converted 
      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       System.out.println("Unsupported encoding exception"); 
       e.printStackTrace(); 
      } 

      // trying to create a key, i don't know if this is right I just did this because I needed a key    
      byte[] key = new byte[4]; 
      int tmpInt = new Random().nextInt(); 
      key[0] = (byte)(tmpInt >> 24); 
      key[1] = (byte)(tmpInt >> 16); 
      key[2] = (byte)(tmpInt >> 8); 
      key[3] = (byte)(tmpInt); 


      Digest digest = new SHA256Digest(); 
      HMac hmac = new HMac(digest); 

      hmac.init(new KeyParameter(key)); // maybe this is the problem? the documentaiton never states where do I get this key or how to generate it 
      hmac.update(input, 0, input.length); 
      byte[] output = new byte[digest.getDigestSize()]; 
      hmac.doFinal(output, 0); 
      dotREZApi.setSessionSig(new String(Hex.encode(output))); 

나는 내가이 site에서 얻는 사람에 비해이에서 얻을 결과,하지만 난하지 않는 경기 :

는 여기에 내가 BouncyCastle과 시도 코드의 현재 작품이다.

라인 input = new String("X-Session-Sig" + tmpSessionId + "test").getBytes("UTF-8");은 문자열을 구성한 다음이를 바이트 []로 변환하여 SHA-256 해시로 변환합니다. 여기서 tmpSessionId는 HTTP 요청에서 가져온 값입니다. 결과 해시는 이후 요청에서 전송됩니다.

+0

당신은 BouncyCastle을 의미합니다. 어떻게 그 끈을 해싱하니? 몇 가지 코드를 보여줄 수 있습니까? SHA-256을 다시 구현할 필요는 없습니다. –

+0

내 편집 된 답변을 확인하고, 몇 가지 코드를 넣었지만 정직하게 말하면 올바른 결과를 얻을 수 없었기 때문에 탄력성을 포기할 것입니다. 내 구현 권한이 있습니까? –

+0

내 문제는 키 생성에있는 것 같지만이 키가 무엇인지 또는 키를 생성하는 방법을 설명하는 설명서를 찾지 못했습니다. 난 무작위 키를 만드는 일반적인 방법을 발견하고 그게 내가 사용하는거야. –

답변

0

결국 BouncyCastle을 사용하지 않았습니다.

내가 J2ME에서 MessageDigest 등을 사용하여 종료하고,이 같은 방법을 사용할 수없는 동안, 나는 그것을 작동시킬 수있다 :

byte[] input = null; 
    try { 
     input = new String("X-Session-Id" + tmpSessionId + "test").getBytes("UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     System.out.println("Unsupported encoding exception"); 
     e.printStackTrace(); 
    } 

    MessageDigest messageDigest; 
    byte[] output = new byte[32]; // since SHA256 hash is 256 bits = 32 bytes 
    try { 
     messageDigest = MessageDigest.getInstance("SHA-256"); 
     messageDigest.update(input, 0, input.length); 
     messageDigest.digest(output, 0, 32); // same 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (DigestException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

나는 BouncyCastle이 대안이 너무 다른 사람을 위해 작동 바랍니다.

BouncyCastle에 문제가있어 BouncyCastle이 대부분의 페이지를 추천 한 이래로 다른 사람이이 질문의 중복을 해제 한 경우 누군가가 중복 된 것으로 표시 될 수 있습니다.

관련 문제