midaskpp 9월 27일, 2021에 포스트됨 공유하기 9월 27일, 2021에 포스트됨 안녕하세요. 자바로 된 SHA-256 암호화 구분을 델파이로 변환 할려고 합니다. public static String encrypt(String base) { try{ MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(base.getBytes("UTF-8")); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash[i]); if(hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } catch(Exception ex){ throw new RuntimeException(ex); } } ------------------------------------------------------------------------ 위의 자바 코드에서 아래 2가지 문법이 이해가 가지 않습니다. 1. byte[] hash = digest.digest(base.getBytes("UTF-8")); 2. String hex = Integer.toHexString(0xff & hash[i]); 델파이로 어떻게 코딩 해야 할지 잘 모르겠습니다. 그리고 if(hex.length() == 1) hexString.append('0'); 은 길이가 1일때 왜 '0'을 추가하라는지 법칙인가요? 아니면 보안을 위한 형식인가요? 자바 고수님들 염치없지만 참고자료나 델파이로 구현 방법 힌트라도 부탁드립니다. 델파이10.4 아키텍쳐를 사용하고 있습니다. 즐거운 하루 되세요..... 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 험프리 9월 29일, 2021에 포스트됨 공유하기 9월 29일, 2021에 포스트됨 올려주신 자바코드는 제가 이해하기로는, SHA256으로 암호화한 바이트배열(byte [])을 HEX 문자열로 변환한 함수 같습니다. 샘플 데이터를 위 코드 실행한 반환 값은 델파이로 변환한 값과 동일할 것 같습니다. 20190114131056783AE1841E52783A >>> 689ed3f9a92e7d9cace97ed95051d51de1678a365ef3325a6ad661f61a98851a 다음 코드는 자바코드를 델파이로 그대로 변환한 코드이며, 기존에 작성하신 코드와 같은 결과를 표시합니다. var Hash := THashSHA2.GetHashBytes(UTF8Encode(Edit1.Text), THashSHA2.TSHA2Version.SHA256); var HexStr: string := ''; for var I := 0 to Length(Hash) - 1 do begin var Hex: string := (Hash[I] and $FF).ToHexString(2); HexStr := HexStr + Hex; end; Edit2.Text := HexStr.ToLower; Edit3.Text := AnsiToUtf8(THashSHA2.GetHashString(Edit1.Text, THashSHA2.TSHA2Version.SHA256).ToLower); 질문하신 자바코드를 해석하면 다음과 같습니다. On 2021. 9. 27. at 오전 11시 17분, midaskpp said: byte[] hash = digest.digest(base.getBytes("UTF-8")); 문자열을 UTF8로 인코딩합니다.(숫자와 문자는 UTF8로 인코딩해도 동일한 값을 반환합니다.) On 2021. 9. 27. at 오전 11시 17분, midaskpp said: String hex = Integer.toHexString(0xff & hash[i]); 0xff & hash[i]의 "&" AND연산자입니다.(보통 마스킹을 위해 AND연산을 사용합니다.) 0XFF는 풀비트이므로, 연산하기 전후의 값은 동일하므로 해당 코드는 불필요한 코드입니다. 참고로 길이가 1인경우 "0"을 붙이는 이유는, SHA256으로 인코딩한 바이트배열의 길이는 32로, 하나의 바이트를 2글자로 표현하기위한 코드입니다. 결론으로 자바 encrypt 함수로 변환한 결과와 작성하신 델파이 코드로 변환한 결과는 같아야 할 것 같습니다. 다른 이유를 제가 예상하기로는(자바로 인코딩 시 다른 값이 나오는 이유는) 1) 변환할 대상 데이터가 다르거나(해당 함수 호출 전 다른 로직이 실행 되어서) 2) 인코딩 이후에 다른 코드가 있을 것으로 예상됩니다. 1 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 김원경 9월 27일, 2021에 포스트됨 공유하기 9월 27일, 2021에 포스트됨 저는 자바 코드는 잘 몰라서 자바소스를 컨버젼하는것은 제외 하고 아래 주소들을 보시면 델파이에서 SHA256 암호화하는 예제들이 있습니다. 도움이 되셨으면 좋겠습니다. 해결되시면 댓글로 달아주시면 다른 분들도 공유해서 보실 수 있을것입니다. https://auroradp.tistory.com/9 https://gist.github.com/MrRobot-prog/b4f76467c376be6348ae0dd42e3aabc5 https://fossies.org/linux/peazip/sha256.pas 1 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 c2design 9월 27일, 2021에 포스트됨 공유하기 9월 27일, 2021에 포스트됨 굳이 자바 코드를 변형 할 필요 없이 델파이에서 여러가지 샘플들이 많이 제공 됩니다. 아래 내용도 같이 보시기 바랍니다. https://tech.devgear.co.kr/delphi_news/441434 1 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 midaskpp 9월 27일, 2021에 포스트됨 Author 공유하기 9월 27일, 2021에 포스트됨 고수님들 답변 감사합니다.. 링크래주신 예제 열심히 테스트 하고 있습니다. 20190114131056(시간: 14자리)+ 783AE1841E52783A (KEY) 라서 20190114131056783AE1841E52783A 를 암호화 하면 결과값 3d119c75bf54e1982827b8d92e6da4072acd25d8b6f6d226c0572fa6fcda745d 이렇게 나와야 하는데 아무리 해도 689ed3f9a92e7d9cace97ed95051d51de1678a365ef3325a6ad661f61a98851a 이렇게 나옵니다. 다른사이트 암호화 결과 확인해도 동일하게 나오구요 위에처럼(689e... 으로) 그래서 위의 자바 구문은 보면 해시로 암호화 해서 또 값은 가공을 하는게 아닌지 궁금합니다. 아래구문처럼 델파이로 코디을해야 정확한 값이 나오는지 잘모르겠네요.. for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash[i]); if(hex.length() == 1) hexString.append('0'); hexString.append(hex); } 열심히 삽질중에 있습니다........ 혹여나 힌트라도 주시면 감사하겠습니다. 두분 답변 달아줘서 정말 감사합니다. 행복하소서 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 midaskpp 9월 27일, 2021에 포스트됨 Author 공유하기 9월 27일, 2021에 포스트됨 (edited) 혹시나해서 테스트 파일 첨부합니다 . 꾸벅 ShaHashSample_test.zip Edited 9월 27일, 2021 by midaskpp 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 midaskpp 9월 29일, 2021에 포스트됨 Author 공유하기 9월 29일, 2021에 포스트됨 결과 확인했습니다. 결국 델파이자체 해시한 값과 자바에서 구현한 값이 동일하게 확인됨니다. 험프리님 너무 감사합니다. 자바 구현 도 상세히 설명해주시고 너무나 감사합니다. 아직 상대 서버를 api 접근 시도를 아직도 하고 있는 상황이라서 검증확인도 하지 못한 상황입니다. 답변 해주신 김원경님 그리고 c2design 님 너무 감사합니다... 행복한 하루 보내시길 바랍니다. 1 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
질문
midaskpp
안녕하세요.
자바로 된 SHA-256 암호화 구분을 델파이로 변환 할려고 합니다.
public static String encrypt(String base) {
try{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(base.getBytes("UTF-8"));
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
} catch(Exception ex){
throw new RuntimeException(ex);
}
}
------------------------------------------------------------------------
위의 자바 코드에서 아래 2가지 문법이 이해가 가지 않습니다.
1. byte[] hash = digest.digest(base.getBytes("UTF-8"));
2. String hex = Integer.toHexString(0xff & hash[i]);
델파이로 어떻게 코딩 해야 할지 잘 모르겠습니다.
그리고 if(hex.length() == 1) hexString.append('0'); 은
길이가 1일때 왜 '0'을 추가하라는지 법칙인가요? 아니면 보안을 위한 형식인가요?
자바 고수님들 염치없지만 참고자료나 델파이로 구현 방법 힌트라도 부탁드립니다.
델파이10.4 아키텍쳐를 사용하고 있습니다.
즐거운 하루 되세요.....
이 댓글 링크
다른 사이트에 공유하기
6 answers to this question
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.