Java'da bir dizenin MD5 karmasını oluşturmak için herhangi bir yöntem var mı?
Java'da bir dizenin MD5 karmasını oluşturmak için herhangi bir yöntem var mı?
Yanıtlar:
Gerek java.security.MessageDigest
.
Kullanabileceğiniz MessageDigest.getInstance("MD5")
bir MD5 örneği almak için arayın MessageDigest
.
Karma işlemlerden birini yaparak hesaplayın:
byte[]
ile bir işlemde karmayı hesaplayın md.digest(bytes)
.MessageDigest
byte[]
Bir kerede arayarak bir yığınmd.update(bytes)
. Girdi bayt eklemeyi bitirdiğinizde, karmayı ile hesaplayın
md.digest()
. byte[]
Tarafından döndürülen md.digest()
MD5 karma olduğunu.
MessageDigest
, verileri parçalar halinde girmenizi sağlar. Statik bir yöntemle bu mümkün olmazdı. Her ne kadar tüm verileri bir kerede iletebildiğinizde, kolaylık sağlamak için yine de bir tane eklemeleri gerektiğini iddia edebilirsiniz.
MessageDigest
Sınıf MD5 özeti örneğine sağlayabilir.
Dizelerle ve kripto sınıflarıyla çalışırken , bayt temsilini istediğiniz kodlamayı her zaman belirttiğinizden emin olun . Yalnızca kullanırsanız string.getBytes()
platform varsayılanını kullanır. (Tüm platformlar aynı varsayılanları kullanmaz)
import java.security.*;
..
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);
Çok fazla veri varsa, .update(byte[])
tekrar tekrar çağrılabilecek yönteme bir göz atın . Sonra .digest()
ortaya çıkan karmayı elde etmek için arayın .
yourString.getBytes(StandardCharsets.UTF_8)
. Bu, elleçlemeyi önler UnsupportedEncodingException
.
Cevabı aslında bir bayt dizisinin aksine bir dize olarak istiyorsanız, her zaman böyle bir şey yapabilirsiniz:
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
bunun yerine kullanabilirsiniz while
, böylece editörler bir döngü içinde dize birleştirme yaptığınız konusunda size bir uyarı vermez.
Ayrıca , MD5 veya SHA özetleri oluşturmak için çok uygun yöntemler sağlayan apache commons codec projesinin DigestUtils sınıfına da bakmak isteyebilirsiniz .
Bunu buldum:
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;
}
aşağıdaki sitede, bunun için hiçbir kredi almak, ama onun işe yarayan bir çözüm! Benim için diğer kod bir sürü düzgün çalışmadı, karma 0s eksik sona erdi. Bu PHP'nin sahip olduğu gibi görünüyor. kaynak: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093
getBytes()
, aksi takdirde kodunuz farklı platformlarda / kullanıcı ayarlarında farklı sonuçlar alır.
byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
İşte nasıl kullanacağım:
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));
Hex nerede: org.apache.commons.codec.binary.Hex
den Apache Commons projesi .
String result = Hex.encodeHexString(resultByte);
Ben sadece commons-codec.jar indirdim ve md5 gibi mükemmel bir php aldım. İşte kılavuz .
Sadece projenize aktarın ve kullanın
String Url = "your_url";
System.out.println( DigestUtils.md5Hex( Url ) );
İşte buyur.
Bunu yapmanın en açık ve özlü yolu olarak buldum:
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
Bir dize temsilinin bir MD5 karma değerinden geri alınması açısından çok daha temiz olan bu çözümü buldum.
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 buradan çıkarıldı .
String.format("%032x", new BigInteger(1, hash));
Bu çözmelidir. 'karma' karma'nın baytı [] 'dır.
Başka bir seçenek Guava Hashing yöntemlerini kullanmaktır :
Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();
Zaten Guava kullanıyorsanız kullanışlı (eğer değilseniz, muhtemelen olmalı).
Hashing.md5().hashString("my string").asBytes();
Başka bir uygulama:
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
Md5 veya sha1, php fonksiyonları ( md5 , sha1 ) benzerler biçiminde düz metin dönüştürmek için bir sınıf (karma ) var:
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));
}
}
Çok karmaşık hale getirmeye gerek yok.
DigestUtils iyi çalışıyor ve hashlerle çalışırken sizi rahat ettiriyormd5
.
DigestUtils.md5Hex(_hash);
veya
DigestUtils.md5(_hash);
Ya da sha
veya gibi diğer şifreleme yöntemlerini kullanabilirsiniz md
.
Çok açıklayıcı olmayan cevabım:
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)
büyük harf biçimine sahip
İlkbaharda da bir DigestUtils
sınıf var :
Bu sınıf md5DigestAsHex()
işi yapan yöntemi içerir .
Takip etmeyi deneyebilirsiniz. Ayrıntılar ve kodları buradan indirebilirsiniz: 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();
}
}
Bombe'nin cevabı doğrudur, ancak kesinlikle MD5 kullanmanız gerekmediği sürece (örn. Birlikte çalışabilirlik için size zorlanana kadar), MD5'in uzun süreli kullanım için zayıflıkları olduğu için daha iyi bir seçim SHA1'dir.
SHA1'in de teorik güvenlik açıklarına sahip olduğunu, ancak o kadar şiddetli olmadığını da eklemeliyim. Karma teknikte mevcut durum, bir dizi aday değiştirme karma fonksiyonunun mevcut olmasıdır, ancak SHA1'in yerini almak için henüz standart en iyi uygulama olarak hiçbiri ortaya çıkmamıştır. Bu nedenle, ihtiyaçlarınıza bağlı olarak, karma algoritmanızı gelecekte değiştirilebilecek şekilde yapılandırmanız önerilir.
Başka bir uygulama: Java'da Hızlı MD5 Uygulaması
String hash = MD5.asHex(MD5.getHash(new File(filename)));
Bunun bunu okuyan herkes için uygun olup olmadığını bilmiyorum, ama sadece istediğim problemi yaşadım
Bunu sadece JRE sınıflarıyla yapmak istedim (Apache Commons veya benzeri yok). Hızlı bir web araması bana her ikisini de aynı anda yapan örnek kod parçacıklarını göstermedi , sadece her görevi ayrı ayrı yaptı. Bu aynı dosyayı iki kez okumayı gerektirdiğinden, dosyayı indirirken anında sağlama toplamı hesaplanarak her iki görevi birleştiren bir kod yazmanın zaman ayırmaya değer olabileceğini düşündüm. Bu benim sonucum (mükemmel Java değilse üzgünüm, ama sanırım yine de fikir olsun):
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)
);
}
Aşağıdaki bağlantıya bir göz atın, Örnek verilen bir görüntünün MD5 Karmasını alır: Görüntünün MD5 Karması
Değeri için, bunun üzerine tökezledim çünkü COM bileşenlerini yükleyecek bir program için doğal bir anahtardan GUID'leri sentezlemek istiyorum; GUID yaşam döngüsünü yönetmeyecek şekilde sentezlemek istiyorum. MD5 kullanacağım ve sonra bir dize almak için UUID sınıfını kullanacağım. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 bu sorunu gündeme getiriyor).
Her durumda, java.util.UUID size MD5 baytlarından güzel bir String sağlayabilir.
return UUID.nameUUIDFromBytes(md5Bytes).toString();
MessageDigest
(bkz. NameUUIDFromBytes () kaynak kodu )
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();
Sadece md5 işlevini çağırarak metninizin bir MD5 karma yapabileceğiniz PHP'nin aksine md5($text)
, Java'da biraz karmaşık hale getirilmiştir. Genellikle md5 karma metnini döndüren bir işlevi çağırarak uyguladım. İşte nasıl uyguladığım, Önce md5hashing
ana sınıfınızın içinde aşağıda verilen şekilde bir işlev oluşturun .
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;
}
Şimdi, aşağıda belirtildiği gibi ihtiyaç duyduğunuzda işlevi çağırın.
String text = textFieldName.getText();
String pass = md5hashing(text);
Burada PHP'de md5 hashing ile eşleşmesi için hashtext'in sıfır ile eklendiğini görebilirsiniz.
En iyi güvenliğe ihtiyacınız yoksa MD5 mükemmel durumdadır ve dosya bütünlüğünü kontrol etmek gibi bir şey yapıyorsanız, güvenlik dikkate alınmaz. Böyle bir durumda, Java kitaplıkları tarafından da desteklenen Adler32 gibi daha basit ve daha hızlı bir şey düşünmek isteyebilirsiniz.
mysql'in md5 işlevinden veya php'nin md5 işlevlerinden vb. aldığınız gibi bu tam md5'i verir. Bu benim kullandığım (ihtiyaçlarınıza göre değiştirebilirsiniz)
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;
}
}
bunu dene:
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)
Sen edebilirsiniz MD5 hash oluşturmak içinde yöntemlerden yararlanarak belirli bir metin için MessageDigest
sınıf java.security
paketinde. Kod snippet'inin tamamı aşağıdadır,
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);
}
}
MD5 işlevinden çıkış, 32 onaltılı sayı ile temsil edilen 128 bitlik bir karedir.
MySQL gibi bir veritabanı kullanıyorsanız, bunu daha basit bir şekilde de yapabilirsiniz. Sorgu Select MD5(“text here”)
, parantez içindeki metnin MD5 karmasını döndürür.
Ben buraya geldim - MD5 karma dizesini döndüren kullanışlı bir scala işlevi:
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));
}
}
Bu konuda Codingkit'te bir makale var. Kontrol edin: http://codingkit.com/a/JAVA/2013/1020/2216.html