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;
}
답변
답변
SHA-1 (및 기타 모든 해싱 알고리즘)은 이진 데이터를 반환합니다. 그것은 (자바에서)을 생성한다는 것을 의미합니다 byte[]
. 그 byte
배열은 않습니다 하지 당신이 단순히으로 바꿀 수 없음을 의미합니다 특정 문자를 나타냅니다 String
당신이했던 것처럼합니다.
이 필요한 경우 로 표현할 수있는 방식으로 String
형식을 지정해야 byte[]
합니다 String
(그렇지 않으면 byte[]
주변을 유지하십시오 ).
byte[]
인쇄 가능한 문자로 임의를 나타내는 두 가지 일반적인 방법 은 BASE64 또는 간단한 16 진 문자열입니다 (즉, 각각 byte
16 진수 두 개로 표시). 16 진수 문자열을 생성하려고하는 것 같습니다.
또 다른 함정이있다 : 당신은 SHA-1 자바의를 얻으려면 String
, 당신은 그것을 변환해야 String
A를 byte[]
(SHA-1의 입력이 그대로 첫번째 byte[]
뿐만 아니라). 표시 myString.getBytes()
한대로 간단히 사용 하는 경우 플랫폼 기본 인코딩을 사용하므로 실행하는 환경에 따라 다릅니다 (예 : OS의 언어 / 로캘 설정에 따라 다른 데이터를 반환 할 수 있음).
더 나은 솔루션은에 사용할 인코딩을 지정하는 것입니다 String
Di의 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);
여기에 최고 등급의 답변을 사용하지 않을 것입니다.
