2012-12-10 6 views
2

나는 맹목적으로 자바 (see here)에 해시 생성에 대한 OWASP의 권고를 따랐습니다, 나는 내가 그것을 제대로했는지 모르겠어요. 특히, 나는 MessageDigest.reset()의 목적과 효과에 대해 확신 할 수 없으므로, 언제 어떻게 사용하는지.는 MessageDigest.reset를 사용하는 경우()

  1. 내 소금과 페이로드를 모두 update() 번에 여러 번 보내 다른 값으로 서명해야합니다. 나는 사전에 reset()을해야합니까? 아니면 나중에?
  2. 왜 다이제스트 (예를 참조)를 루프 내에 reset() 되?

    MessageDigest md = MessageDigest.getInstance("SHA-256"); 
    md.update(salt); 
    md.update(payload1); // part 1 of payload 
    md.update(payload2); // part 2 of payload 
    md.update(serialNumber); // part 3 of payload 
    md.reset(); 
    byte[] sig = md.digest(); 
    for (int i=0; i<1000; i++) { 
        md.reset(); 
        sig = md.digest(sig); 
    } 
    

    은 내가 관찰하고있어 서명이 serialNumber이 변경되는 경우에도 동일하게 유지한다는 것입니다 :

여기 내 코드입니다. '재설정()'통화를하지 않으면 신호가 변경됩니다.

+0

가능한 복제본 [사용하기 전에 MessageDigest.reset()을 호출해야합니까?] (http://stackoverflow.com/questions/7546549/do-i-need-to-call-messagedigest-reset-before) -using-it) – durron597

답변

5

이미 MessageDigest의 인스턴스를 사용했다면 reset으로 전화해야합니다. 이전 설정을 모두 지우려면 reset을 호출해야합니다.

MessageDigest.getInstancesingleton이 아닌 factory method이므로 중요한 오버 헤드가 첨부되어 있습니다. MessageDigest.getInstance 가입일

:

지정된 알고리즘을 지원하는 제 바이더로부터으로부터 MessageDigest 구현을 캡슐화하는 새로운 MessageDigest 등 개체.

다시 사용하면 MessageDigest.getInstance을 다시 호출하는 오버 헤드를 다시 피할 수 있습니다.

+0

그래서 OWASP 예제와 코드가 잘못 되었습니까? 항상 새로운 인스턴스를 얻는다면'reset '을 전혀 필요로하지 않습니까? – Hank

+0

재설정 및 재사용으로 갈 것입니다 :) – Reimeus

+0

@ Hank -'.getInstance'가 루프 외부에 있으므로 항상 새로운 인스턴스를 얻는 것은 아닙니다. '.reset'을 사용하면 좋습니다. – webnoob

5

코드가 내 눈에 띄지 만 여기에 잘못 읽었을 수도 있지만 docsdigest()이 암시 적으로 인스턴스를 재설정한다고 말합니다. 따라서 1) 이전에 update()라고하고 2) 인스턴스를 다시 사용해야했지만 update() 호출 결과가 필요하지 않은 경우 reset()으로 전화하십시오. 귀하의 경우에는

, 나는 또한 당신이 reset()에 첫 번째 통화를 생략 할 필요가 있다고 생각합니다. 그렇지 않으면, 당신은 소금과 유료 하중으로부터 어떤 이익도 버리고 있습니다. 루프 내부의 reset()에 대한 호출은 필요하지 않지만 계산 결과를 변경해서는 안됩니다.

희망이 있습니다.

+0

전적으로 원래 코드는 * 첫 번째'reset()'호출에서 제외되었습니다. 암시 적 리셋에 관한 포인터 주셔서 감사합니다! – Hank