Czy jest jakaś metoda generowania skrótu MD5 ciągu znaków w Javie?
Czy jest jakaś metoda generowania skrótu MD5 ciągu znaków w Javie?
Odpowiedzi:
Potrzebujesz java.security.MessageDigest
.
Zadzwoń, MessageDigest.getInstance("MD5")
aby uzyskać instancję MD5MessageDigest
której możesz użyć.
Oblicz skrót, wykonując jedną z następujących czynności:
byte[]
i oblicz wartość skrótu w jednej operacji za pomocąmd.digest(bytes)
.MessageDigest
jedną byte[]
porcję, dzwoniąc md.update(bytes)
. Po zakończeniu dodawania bajtów wejściowych obliczyć skrót za pomocą
md.digest()
.byte[]
Zwrócony przez md.digest()
to hash MD5.
MessageDigest
pozwala na wprowadzanie danych w porcjach. Nie byłoby to możliwe przy użyciu metody statycznej. Chociaż możesz argumentować, że i tak powinni byli dodać jeden dla wygody, gdy możesz przekazać wszystkie dane naraz.
MessageDigest
Klasa może dostarczyć instancji MD5.
Podczas pracy z łańcuchami i klasami kryptograficznymi pamiętaj, aby zawsze określać kodowanie, w którym ma być reprezentowana bajt. Jeśli tylko użyjesz string.getBytes()
, użyje domyślnej platformy. (Nie wszystkie platformy używają tych samych ustawień domyślnych)
import java.security.*;
..
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);
Jeśli masz dużo danych, spójrz na .update(byte[])
metodę, którą można wywoływać wielokrotnie. Następnie zadzwoń, .digest()
aby uzyskać wynikowy skrót.
yourString.getBytes(StandardCharsets.UTF_8)
. Zapobiega to obsłudze UnsupportedEncodingException
.
Jeśli faktycznie chcesz otrzymać odpowiedź w postaci łańcucha, a nie tablicy bajtów, zawsze możesz zrobić coś takiego:
String plaintext = "your text here";
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
hashtext = "0"+hashtext;
}
hashtext = "0".repeat(32 - hashtext.length()) + hashtext
zamiast niej while
, więc redaktorzy nie będą dawać ostrzeżenia, że łączysz łańcuch w pętli.
Możesz także przyjrzeć się klasie DigestUtils projektu kodeka apache commons , który zapewnia bardzo wygodne metody tworzenia skrótów MD5 lub SHA.
Znajdź to:
public String MD5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(md5.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
}
na poniższej stronie nie biorę za to uznania, ale jest to rozwiązanie, które działa! Dla mnie wiele innych kodów nie działało poprawnie, skończyło mi się na zera w haszu. Ten wydaje się być taki sam jak PHP. źródło: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093
getBytes()
przeciwnym razie twój kod uzyska inne wyniki na różnych platformach / ustawieniach użytkownika.
byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
Oto jak go używam:
final MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(string.getBytes(Charset.forName("UTF8")));
final byte[] resultByte = messageDigest.digest();
final String result = new String(Hex.encodeHex(resultByte));
gdzie Hex: org.apache.commons.codec.binary.Hex
z projektu Apache Commons .
String result = Hex.encodeHexString(resultByte);
Właśnie pobrałem plik commons-codec.jar i uzyskałem doskonały php, taki jak md5. Oto instrukcja .
Po prostu zaimportuj go do swojego projektu i użyj
String Url = "your_url";
System.out.println( DigestUtils.md5Hex( Url ) );
i masz to.
Uważam, że jest to najbardziej jasny i zwięzły sposób:
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
Znalazłem to rozwiązanie, które jest o wiele czystsze pod względem odzyskiwania reprezentacji String z skrótu MD5.
import java.security.*;
import java.math.*;
public class MD5 {
public static void main(String args[]) throws Exception{
String s="This is a test";
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(s.getBytes(),0,s.length());
System.out.println("MD5: "+new BigInteger(1,m.digest()).toString(16));
}
}
Kod został wyciągnięty stąd .
String.format("%032x", new BigInteger(1, hash));
To powinno rozwiązać ten problem. „hash” jest bajtem [] hash.
Inną opcją jest użycie metod mieszania guawy :
Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();
Przydatne, jeśli już używasz Guawy (a jeśli nie, prawdopodobnie powinieneś).
Hashing.md5().hashString("my string").asBytes();
Kolejne wdrożenie:
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
Mam Class (Hash) do konwersji zwykłego tekstu w skrócie w formatach: md5 lub sha1, simillar, który działa w php ( md5 , sha1 ):
public class Hash {
/**
*
* @param txt, text in plain format
* @param hashType MD5 OR SHA1
* @return hash in hashType
*/
public static String getHash(String txt, String hashType) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType);
byte[] array = md.digest(txt.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
//error action
}
return null;
}
public static String md5(String txt) {
return Hash.getHash(txt, "MD5");
}
public static String sha1(String txt) {
return Hash.getHash(txt, "SHA1");
}
}
<?php
echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";
MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0
public class HashTest {
@Test
public void test() {
String txt = "Hello World";
assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt));
assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt));
}
}
Nie trzeba tego komplikować.
DigestUtils działa dobrze i zapewnia wygodę podczas pracy z md5
hashami.
DigestUtils.md5Hex(_hash);
lub
DigestUtils.md5(_hash);
Możesz użyć dowolnej innej metody szyfrowania, takiej jak sha
lub md
.
Moja niezbyt odkrywcza odpowiedź:
private String md5(String s) {
try {
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(s.getBytes(), 0, s.length());
BigInteger i = new BigInteger(1,m.digest());
return String.format("%1$032x", i);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
String.format("%1$032X", big)
mieć format wielkich liter
Możesz spróbować śledzić. Zobacz szczegóły i pobierz kody tutaj: http://jkssweetlife.com/java-hashgenerator-md5-sha-1/
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Example {
public static void main(String[] args) throws Exception {
final String inputString = "Hello MD5";
System.out.println("MD5 hex for '" + inputString + "' :");
System.out.println(getMD5Hex(inputString));
}
public static String getMD5Hex(final String inputString) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(inputString.getBytes());
byte[] digest = md.digest();
return convertByteToHex(digest);
}
private static String convertByteToHex(byte[] byteData) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
}
Odpowiedź Bombe jest poprawna, jednak zauważ, że o ile nie musisz bezwzględnie korzystać z MD5 (np. Zmuszonego do współpracy), lepszym wyborem jest SHA1, ponieważ MD5 ma słabości do długotrwałego użytkowania.
Powinienem dodać, że SHA1 ma również luki teoretyczne, ale nie tak poważne. Obecny stan techniki w dziedzinie mieszania polega na tym, że istnieje wiele kandydujących funkcji mieszających zastępujących, ale żadna z nich nie stała się jeszcze standardową najlepszą praktyką zastępującą SHA1. Tak więc, w zależności od potrzeb, dobrze jest skonfigurować algorytm skrótu, aby można go było zmienić w przyszłości.
Kolejna implementacja: szybka implementacja MD5 w Javie
String hash = MD5.asHex(MD5.getHash(new File(filename)));
Nie wiem, czy jest to istotne dla każdego, kto to czyta, ale właśnie miałem problem, który chciałem
Chciałem to zrobić tylko z klasami JRE (bez Apache Commons lub podobnego). Szybkie wyszukiwanie w Internecie nie pokazało mi fragmentów przykładowego kodu wykonujących oba jednocześnie, tylko każde zadanie osobno. Ponieważ wymaga to dwukrotnego przeczytania tego samego pliku, pomyślałem, że warto poświęcić chwilę na napisanie kodu, który ujednolica oba zadania, obliczając sumę kontrolną w locie podczas pobierania pliku. Oto mój wynik (przepraszam, jeśli nie jest to idealna Java, ale myślę, że i tak rozumiesz):
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.security.DigestOutputStream; // new
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
void downloadFile(String fromURL, String toFile, BigInteger md5)
throws IOException, NoSuchAlgorithmException
{
ReadableByteChannel in = Channels.newChannel(new URL(fromURL).openStream());
MessageDigest md5Digest = MessageDigest.getInstance("MD5");
WritableByteChannel out = Channels.newChannel(
//new FileOutputStream(toFile)); // old
new DigestOutputStream(new FileOutputStream(toFile), md5Digest)); // new
ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); // 1 MB
while (in.read(buffer) != -1) {
buffer.flip();
//md5Digest.update(buffer.asReadOnlyBuffer()); // old
out.write(buffer);
buffer.clear();
}
BigInteger md5Actual = new BigInteger(1, md5Digest.digest());
if (! md5Actual.equals(md5))
throw new RuntimeException(
"MD5 mismatch for file " + toFile +
": expected " + md5.toString(16) +
", got " + md5Actual.toString(16)
);
}
Spójrz na następujący link, w przykładzie otrzymano skrót MD5 dostarczonego obrazu: skrót MD5 obrazu
Na ile warto, natknąłem się na to, ponieważ chcę zsyntetyzować identyfikatory GUID z naturalnego klucza dla programu, który zainstaluje komponenty COM; Chcę syhthesize, aby nie zarządzać cyklem życia GUID. Użyję MD5, a następnie klasy UUID, aby uzyskać z niego ciąg znaków. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 podnosi ten problem).
W każdym razie java.util.UUID może uzyskać ładny ciąg z bajtów MD5.
return UUID.nameUUIDFromBytes(md5Bytes).toString();
MessageDigest
(patrz kod źródłowy nameUUIDFromBytes () )
import java.security.*;
import javax.xml.bind.*;
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytesOfDigest = md.digest(bytesOfMessage);
String digest = DatatypeConverter.printHexBinary(bytesOfDigest).toLowerCase();
W przeciwieństwie do PHP, w którym można zrobić skrót MD5 tekstu, po prostu wywołując funkcję md5, tj. md5($text)
W Javie było to trochę skomplikowane. Zwykle implementowałem go, wywołując funkcję, która zwraca tekst skrótu md5. Oto jak to zaimplementowałem. Najpierw utwórz funkcję o nazwie md5hashing
wewnątrz głównej klasy, jak podano poniżej.
public static String md5hashing(String text)
{ String hashtext = null;
try
{
String plaintext = text;
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
hashtext = "0"+hashtext;
}
} catch (Exception e1)
{
// TODO: handle exception
JOptionPane.showMessageDialog(null,e1.getClass().getName() + ": " + e1.getMessage());
}
return hashtext;
}
Teraz wywoływaj funkcję, ilekroć potrzebujesz, jak podano poniżej.
String text = textFieldName.getText();
String pass = md5hashing(text);
Tutaj możesz zobaczyć, że hashtext jest dołączony do zera, aby dopasować go do haszowania md5 w PHP.
MD5 jest całkowicie w porządku, jeśli nie potrzebujesz najlepszego bezpieczeństwa, a jeśli robisz coś takiego, jak sprawdzanie integralności pliku, bezpieczeństwo nie jest brane pod uwagę. W takim przypadku możesz rozważyć coś prostszego i szybszego, na przykład Adler32, który jest również obsługiwany przez biblioteki Java.
ten daje dokładny md5, jaki otrzymujesz z funkcji md5 mysql lub funkcji md5 php itp. To jest to, którego używam (możesz zmienić zgodnie z własnymi potrzebami)
public static String md5( String input ) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(input.getBytes( "UTF-8" ));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; i++) {
sb.append( String.format( "%02x", array[i]));
}
return sb.toString();
} catch ( NoSuchAlgorithmException | UnsupportedEncodingException e) {
return null;
}
}
Spróbuj tego:
public static String getHashMD5(String string) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
BigInteger bi = new BigInteger(1, md.digest(string.getBytes()));
return bi.toString(16);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(MD5Utils.class
.getName()).log(Level.SEVERE, null, ex);
return "";
}
}
import java.security.MessageDigest
val digest = MessageDigest.getInstance("MD5")
//Quick MD5 of text
val text = "MD5 this text!"
val md5hash1 = digest.digest(text.getBytes).map("%02x".format(_)).mkString
//MD5 of text with updates
digest.update("MD5 ".getBytes())
digest.update("this ".getBytes())
digest.update("text!".getBytes())
val md5hash2 = digest.digest().map(0xFF & _).map("%02x".format(_)).mkString
//Output
println(md5hash1 + " should be the same as " + md5hash2)
Możesz wygenerować skrót MD5 dla danego tekstu, korzystając z metod w MessageDigest
klasie w java.security
pakiecie. Poniżej znajduje się pełny fragment kodu,
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;
public class MD5HashGenerator
{
public static void main(String args[]) throws NoSuchAlgorithmException
{
String stringToHash = "MyJavaCode";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(stringToHash.getBytes());
byte[] digiest = messageDigest.digest();
String hashedOutput = DatatypeConverter.printHexBinary(digiest);
System.out.println(hashedOutput);
}
}
Dane wyjściowe z funkcji MD5 to 128-bitowy skrót reprezentowany przez 32 liczby szesnastkowe.
Jeśli używasz bazy danych takiej jak MySQL, możesz to zrobić również w prostszy sposób. Zapytanie Select MD5(“text here”)
zwróci skrót MD5 tekstu w nawiasie.
Oto po co tu przyszedłem - przydatna funkcja scala, która zwraca ciąg skrótu MD5:
def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* MD5 encryption
*
* @author Hongten
*
*/
public class MD5 {
public static void main(String[] args) {
System.out.println(MD5.getMD5("123456"));
}
/**
* Use md5 encoded code value
*
* @param sInput
* clearly
* @ return md5 encrypted password
*/
public static String getMD5(String sInput) {
String algorithm = "";
if (sInput == null) {
return "null";
}
try {
algorithm = System.getProperty("MD5.algorithm", "MD5");
} catch (SecurityException se) {
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance(algorithm);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte buffer[] = sInput.getBytes();
for (int count = 0; count < sInput.length(); count++) {
md.update(buffer, 0, count);
}
byte bDigest[] = md.digest();
BigInteger bi = new BigInteger(bDigest);
return (bi.toString(16));
}
}
Na ten temat znajduje się artykuł na temat Codingkit. Sprawdź: http://codingkit.com/a/JAVA/2013/1020/2216.html