[java] SHA1에 Java 문자열

Java에서 간단한 String to SHA1 변환기를 만들려고하는데 이것이 내가 가진 것입니다 …

public static String toSHA1(byte[] convertme) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA-1");
    }
    catch(NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return new String(md.digest(convertme));
}

나는 그것을 통과하면 toSHA1("password".getBytes()), 내가 얻을 [�a�ɹ??�%l�3~��.내가 아마 UTF-8 같은 간단한 인코딩 수정 알고,하지만 누군가는 내가 어떤 원하는 것을 얻기 위해 무엇을해야하는지 말해 줄 수 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8? 아니면 내가 완전히 잘못하고 있습니까?



답변

UPDATE
당신은 사용할 수 있습니다 아파치 코 몬즈 코덱 당신을 위해이 일을 할 (버전 1.7+).

DigestUtils.sha1Hex (stringToConvertToSHexRepresentation)

이 제안에 대해 @ Jon Onstott 에게 감사합니다 .


이전 답변
바이트 배열을 16 진 문자열로 변환하십시오. 레알의 방법은 방법을 알려줍니다 .

return byteArrayToHexString(md.digest(convertme))

(Real의 How To에서 복사)

public static String byteArrayToHexString(byte[] b) {
  String result = "";
  for (int i=0; i < b.length; i++) {
    result +=
          Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
  }
  return result;
}

BTW, Base64를 사용하여 더 간결하게 표현할 수 있습니다. Apache Commons Codec API 1.4 는 모든 고통을 없애기위한 훌륭한 유틸리티입니다. 여기를 참조하십시오


답변

이것은 문자열을 sha1로 변환하는 솔루션입니다. 내 안드로이드 앱에서 잘 작동합니다.

private static String encryptPassword(String password)
{
    String sha1 = "";
    try
    {
        MessageDigest crypt = MessageDigest.getInstance("SHA-1");
        crypt.reset();
        crypt.update(password.getBytes("UTF-8"));
        sha1 = byteToHex(crypt.digest());
    }
    catch(NoSuchAlgorithmException e)
    {
        e.printStackTrace();
    }
    catch(UnsupportedEncodingException e)
    {
        e.printStackTrace();
    }
    return sha1;
}

private static String byteToHex(final byte[] hash)
{
    Formatter formatter = new Formatter();
    for (byte b : hash)
    {
        formatter.format("%02x", b);
    }
    String result = formatter.toString();
    formatter.close();
    return result;
}


답변

사용 구아바 해싱 클래스를 :

Hashing.sha1().hashString( "password", Charsets.UTF_8 ).toString()


답변

SHA-1 (및 기타 모든 해싱 알고리즘)은 이진 데이터를 반환합니다. 그것은 (자바에서)을 생성한다는 것을 의미합니다 byte[]. 그 byte배열은 않습니다 하지 당신이 단순히으로 바꿀 수 없음을 의미합니다 특정 문자를 나타냅니다 String당신이했던 것처럼합니다.

이 필요한 경우 로 표현할 수있는 방식으로 String형식을 지정해야 byte[]합니다 String(그렇지 않으면 byte[]주변을 유지하십시오 ).

byte[]인쇄 가능한 문자로 임의를 나타내는 두 가지 일반적인 방법 은 BASE64 또는 간단한 16 진 문자열입니다 (즉, 각각 byte16 진수 두 개로 표시). 16 진수 문자열을 생성하려고하는 것 같습니다.

또 다른 함정이있다 : 당신은 SHA-1 자바의를 얻으려면 String, 당신은 그것을 변환해야 StringA를 byte[](SHA-1의 입력이 그대로 첫번째 byte[]뿐만 아니라). 표시 myString.getBytes()한대로 간단히 사용 하는 경우 플랫폼 기본 인코딩을 사용하므로 실행하는 환경에 따라 다릅니다 (예 : OS의 언어 / 로캘 설정에 따라 다른 데이터를 반환 할 수 있음).

더 나은 솔루션은에 사용할 인코딩을 지정하는 것입니다 StringDi의 byte[]이 같은 변환 : myString.getBytes("UTF-8"). UTF-8 (또는 모든 유니 코드 문자를 나타낼 수있는 다른 인코딩)을 선택하는 것이 가장 안전한 선택입니다.


답변

이것은 문자열을 16 진 형식으로 변환 할 때 사용할 수있는 간단한 솔루션입니다.

private static String encryptPassword(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {

    MessageDigest crypt = MessageDigest.getInstance("SHA-1");
    crypt.reset();
    crypt.update(password.getBytes("UTF-8"));

    return new BigInteger(1, crypt.digest()).toString(16);
}


답변

Apache Commons 코덱 라이브러리를 사용하십시오. DigestUtils 라는 유틸리티 클래스가 있습니다.

세부 정보를 얻을 필요가 없습니다.


답변

앞서 언급했듯이 아파치 커먼즈 코덱을 사용하십시오. Spring 사람들도 추천합니다 (Spring Doc의 DigestUtils 참조). 예 :

DigestUtils.sha1Hex(b);

여기에 최고 등급의 답변을 사용하지 않을 것입니다.