MD5 හැෂ් එකක් ජනනය කරන්නේ කෙසේද?


1013

ජාවා හි එම්ඩී 5 හැෂ් නූලක් ජනනය කිරීමට ක්‍රමයක් තිබේද?



41
MD5 එක්-මාර්ග ආරක්ෂණ අංගයක් ලෙස අනාරක්ෂිත විය හැකි නමුත් එය සාමාන්‍ය චෙක්සම් යෙදුම් සඳහා තවමත් හොඳය.
rustyx

ඔබට ඉතා පහසුවෙන් විසඳා ගත හැකි php වලින් උත්සාහ කළ හැකිය.
අනුපම් හල්ඩ්කාර්

Answers:


606

ඔබට අවශ්‍යයි java.security.MessageDigest.

ඔබට භාවිතා කළ හැකි MessageDigest.getInstance("MD5")MD5 උදාහරණයක් ලබා ගැනීමට අමතන්න MessageDigest.

එකක් කිරීමෙන් හැෂ් ගණනය කරන්න:

  • සම්පූර්ණ ආදානය a ලෙස පෝෂණය byte[]කර එක් මෙහෙයුමක දී හැෂ් ගණනය කරන්න md.digest(bytes).
  • ඇමතුමකින් MessageDigestවරකට එක byte[]කැබැල්ලක් පෝෂණය කරන්න md.update(bytes). ආදාන බයිට් එකතු කිරීම ඔබ අවසන් කළ විට, සමඟ හැෂ් ගණනය කරන්න md.digest().

මෙම byte[]විසින් ලබා md.digest()තුළ MD5 හැෂ් වේ.


146
මෙහි සඳහන් නොවන එක් දෙයක්, මා පුදුමයට පත් කළේය. MessageDigest පන්ති නූල් ආරක්ෂිත නොවේ. ඒවා විවිධ නූල් භාවිතා කිරීමට යන්නේ නම්, ඒවා නැවත භාවිතා කිරීමට උත්සාහ කරනවා වෙනුවට නව එකක් සාදන්න.
mjuarez

40
එහි අභ්‍යන්තර තත්වය විකෘති කිරීමට එය විවිධ ක්‍රම භාවිතා කරයි. නූල් ආරක්ෂාව නොමැතිකම පුදුමයට කරුණක් වන්නේ කෙසේද?
බොම්බේ

91
@Bombe: ඇයි අපි බලාපොරොත්තු විය යුතු ඇති MessageDigest අභ්යන්තර රාජ්ය කිරීම පිළිබඳව දැන ගැනීමට?
ඩෑන් බැරෝවි

29
@DanBarowy හොඳින්, ඔබ ඇත එය mutating (එනම් ඉල්ලා වටිනාකම් නැවත බව නැහැ නමුත් වෙනත් ක්රම වෙනස් අගයන් නැවත ඇති ක්රම) එසේ ඔප්පු වන තෙක් වෙනත් ආකාරයකින් ඔබට සෑම විටම එය එසේ කිරීමට නූල්-ආරක්ෂිත නැහැ කියලා හිතන්න යුතුය.
බොම්බේ

3
RaTraubenfuchs MessageDigestඔබට කුට්ටි වල දත්ත ඇතුළත් කිරීමට ඉඩ දෙයි. ස්ථිතික ක්‍රමයකින් එය කළ නොහැකි වනු ඇත. ඔබට තර්ක කළ හැකි වුවද, ඔබට සියලු දත්ත එකවරම සම්මත කළ හැකි විට ඔවුන් පහසුව සඳහා එකක් එකතු කළ යුතුව තිබුණි.
user253751

693

මෙම MessageDigestපන්ති තුළ MD5 ජීර්ණය ක උදාහරණයක් ඔබට ලබා ගත හැක.

නූල් සහ ක්‍රිප්ටෝ පංති සමඟ වැඩ කරන විට ඔබට බයිට් නිරූපණය අවශ්‍ය කේතන ක්‍රමය සැමවිටම සඳහන් කිරීමට වග බලා ගන්න . ඔබ එය භාවිතා කරන්නේ නම් string.getBytes()එය වේදිකා පෙරනිමිය භාවිතා කරයි. (සියලුම වේදිකා එකම පෙරනිමි භාවිතා නොකරයි)

import java.security.*;

..

byte[] bytesOfMessage = yourString.getBytes("UTF-8");

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);

ඔබ සතුව දත්ත විශාල ප්‍රමාණයක් තිබේ .update(byte[])නම් නැවත නැවත කැඳවිය හැකි ක්‍රමය දෙස බලන්න . ඉන්පසු .digest()ලැබෙන හැෂ් ලබා ගැනීමට අමතන්න .


“LATIN1”! = “ASCII” (හෝ “US-ASCII”). ASCII යනු බිට් 7 අක්ෂර කට්ටලයකි, ලතින් 1 යනු බිටු 8 අක්ෂර කට්ටලයකි. ඒවා සමාන නොවේ.
බොම්බේ

8
( වඩා හොඳ තාර්කිකත්වය සහ පැහැදිලි කිරීම සඳහා joelonsoftware.com/articles/Unicode.html බලන්න )
පිස්ක්වෝර් ගොඩනැගිල්ලෙන් පිටව ගියේ

14
එහි ප්‍රති ing ලයක් ලෙස ඇති බයිට් හෙක්ස් නූල් බවට පරිවර්තනය කිරීමට අවශ්‍ය නම් මෙම මාතෘකාව ද ප්‍රයෝජනවත් වේ.
සති අන්ත

1
එහෙනම් ඔබ මෙම තයිජෙස්ට් එක නූල් බවට පරිවර්තනය කරන්නේ කෙසේද?
හම්ෆ්රි

2
වඩා හොඳ, හැකි තැනක yourString.getBytes(StandardCharsets.UTF_8). මෙය හැසිරවීම වළක්වයි UnsupportedEncodingException.
නිහතමානී ඉංජිනේරු බීවී

269

ඔබට ඇත්ත වශයෙන්ම පිළිතුර බයිට් අරාවකට වඩා නූලක් ලෙස අවශ්‍ය නම්, ඔබට සැමවිටම මෙවැනි දෙයක් කළ හැකිය:

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;
}

12
AlBalusC: සත්‍ය නොවේ, BigInteger.toString ක්‍රමය මඟින් නියම කර ඇති පාදමෙහි සම්පූර්ණ අංකය ලබා දෙනු ඇත. 0x0606 606 ලෙස මුද්‍රණය කෙරෙනු ඇත, පසුපස ඇති ශුන්‍යයන් මඟ හැරී ඇත,
Spidey

11
කුඩා නිට්පික්: getInstance ඇමතූ වහාම m.reset () අවශ්‍ය නොවේ. වඩා සුළු: 'ඔබේ පෙළ මෙහි' සඳහා ද්විත්ව උපුටා දැක්වීම් අවශ්‍ය වේ.
ඩේවිඩ් ලෙපික්

ජාවා 11 සිට, ඔබට hashtext = "0".repeat(32 - hashtext.length()) + hashtextඒ වෙනුවට භාවිතා කළ හැකිය while, එබැවින් ඔබ ලූපයක් තුළ නූල් සම්මුතියක් කරන බවට කතුවරුන් ඔබට අනතුරු ඇඟවීමක් නොකරයි.
ටොම්

M.update වෙනුවට (plaintext.getBytes ()); කේතීකරණය නියම කිරීමට මම නිර්දේශ කරමි. m.update (plaintext.getBytes ("UTF-8")); getBytes () කේතීකරණය සහතික නොකරන අතර පද්ධතියෙන් පද්ධතියට වෙනස් විය හැකි අතර එමඟින් එකම සංගීතයක් සඳහා පද්ධති අතර විවිධ MD5 ප්‍රති results ල ලැබෙනු ඇත.
user1819780

256

MD5 හෝ SHA ජීර්ණයන් නිර්මාණය කිරීම සඳහා ඉතා පහසු ක්‍රම සපයන අපාචේ කොමන්ස් කෝඩෙක් ව්‍යාපෘතියේ ඩයිජෙස්ටිල්ස් පන්තිය දෙස බැලීමටද ඔබට අවශ්‍ය විය හැකිය .


2
විශේෂයෙන්, බයිට් දත්තවල “ආරක්ෂිත” කේතනය කළ නිරූපණයන් නූල් ආකාරයෙන් ලබා දෙන ක්‍රම.
රොබ්

4
කෙසේ වෙතත්, ඔබේ ව්‍යාපෘතියට ඩයිජෙස්ටිල්ස් පන්තිය ලබා ගැනීමට පහසු ක්‍රමයක් නොමැත, ලිබ් ටොන් එකක් එකතු නොකර, හෝ අවම වශයෙන් තවත් පන්ති දෙකක් අවශ්‍ය වන “අතින්” පන්තිය වරාය කිරීම.
iuiz

මේවන් ගබඩාවලද එය සොයාගත නොහැක. Grrrr.
sparkyspider

5
මට පිස්සු හැදුනොත් මිස මධ්‍යම මාවන් ගබඩාවල තිබිය යුතුය: groupId = commons-codec artifactId = commons-codec version = 1.5
නික් ස්පේස්ක්

162

මෙය හමු විය:

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;
}

පහත වෙබ් අඩවියේ, මම ඒ සඳහා කිසිදු ගෞරවයක් නොගනිමි, නමුත් එය ක්‍රියාත්මක වන විසඳුමකි! මට වෙනත් කේත බොහොමයක් නිසියාකාරව ක්‍රියාත්මක නොවූ නිසා, මම හැෂ් හි 0s අතුරුදහන් විය. මෙය PHP සතුව ඇති ආකාරයටම පෙනේ. මූලාශ්‍රය: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093


15
භාවිතා කළ යුතු කේතන ක්‍රමය ඔබ විසින් නියම කළ යුතුය getBytes(), එසේ නොමැතිනම් ඔබේ කේතය විවිධ වේදිකා / පරිශීලක සැකසුම් මත වෙනස් ප්‍රති results ල ලබා ගනී.
Paŭlo Ebermann

Ŭ PaŭloEbermann do MessageDigest.getInstance ("MD5"); මදි? GetBytes () හි "MD5" එක් කිරීමට මම උත්සාහ කළ නමුත් එය දෝෂයක් ඇති කළේය
බ්ලේස් ටමා

2
La බ්ලේස්ටාමා "එම්ඩී 5" යනු කේතන ක්‍රමයක් නොවේ, එය පණිවිඩ ඩයිජෙස්ට් ඇල්ගොරිතමයකි (නව යෙදුම්වල භාවිතා කළ යුතු එකක් නොවේ). කේතන ක්‍රමයක් යනු ඇල්ගොරිතම යුගලයක් වන අතර එය බයිට් නූල් බවටත් නූල් බයිට් බවටත් පරිවර්තනය කරයි. උදාහරණයක් ලෙස "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE" සහ ඊට සමාන ය. මෙම නූලෙහි හැෂ් එකක් ගණනය කරන අනෙක් සෑම පාර්ශවයක්ම එකම කේතන ක්‍රමයක් භාවිතා කරන්න, එසේ නොමැතිනම් ඔබට වෙනස් ප්‍රති .ල ලැබෙනු ඇත.
Paŭlo Ebermann

6
අක්ෂර කට්ටලයට උදාහරණයක් සඳහා ... (යූටීඑෆ් -8 භාවිතා කරන්න, එය මගේ මතය අනුව හොඳම හා වඩාත්ම අනුකූල වේ) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
රිචඩ්

එය මගේ විසඳුම නොවන නිසාත්, සියලු අවස්ථා මා විසින්ම පරීක්‍ෂා නොකළ නිසාත්, මම එය නොවෙනස්ව තබමි, නමුත් කේතීකරණ යනාදිය නියම කිරීම හොඳ අදහසක් යැයි මම සිතමි.
dac2009

88

මෙන්න මම එය භාවිතා කරන ආකාරය:

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 යනු: org.apache.commons.codec.binary.Hexවෙතින් Apache Commons ව්යාපෘතිය .


14
ඔබ කෙසේ හෝ Apache Commons Codec භාවිතා කරන්නේ නම් ඔබට භාවිතා කළ හැකිය: commons.apache.org/codec/api-release/org/apache/commons/codec/…
squiddle

13
මම මේ සමඟ අවසාන පේළිය ආදේශ කරමි:String result = Hex.encodeHexString(resultByte);
නිල්

84

මම දැන් commons-codec.jar බාගත කර md5 වැනි පරිපූර්ණ php ලබා ගත්තා. මෙන්න අත්පොත .

එය ඔබේ ව්‍යාපෘතියට ආනයනය කර භාවිතා කරන්න

String Url = "your_url";

System.out.println( DigestUtils.md5Hex( Url ) );

එහි ඔබට එය තිබේ.


1
MySQL ශ්‍රිතයට සමාන ප්‍රතිලාභ අගයක් ලබා දෙන ක්‍රමය මෙයයි md5 (str). අනෙක් පිළිතුරු බොහොමයක් වෙනත් අගයන් ලබා දුන්නේය.
rwitzel

1
ඇන්ඩ්‍රොයිඩ් වල මෙය නිවැරදිව ක්‍රියා නොකරන්නේ ඇන්ඩ්‍රොයිඩ් විසින් කොමන්ස්
එපික් පැන්ඩාෆෝර්ස්

77

මෙය කිරීමට වඩාත්ම පැහැදිලි හා සංක්ෂිප්ත ක්‍රමය ලෙස මම සොයාගෙන ඇත:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));

3
මහා. එය ප්‍රමුඛ ශුන්‍යයන් කපා දැමීමේ උගුලට වැටෙන්නේ නැත.
මාකස් පිස්චයිඩ්

2
ඔබ API මට්ටම <19 භාවිතා කරන්නේ නම් මෙය ඇන්ඩ්‍රොයිඩ් සඳහා ක්‍රියා නොකරනු ඇතැයි පරිස්සම් වන්න, නමුත් ඔබට දෙවන පේළිය md5.update (string.getBytes ("UTF-8")) සමඟ වෙනස් කළ යුතුය; මෙය හැසිරවීමට තවත් පරීක්ෂා කළ ව්‍යතිරේකයක් එකතු කරනු ඇත, නමුත් ...
ෆ්‍රාන් මාර්සෝවා

34

එම්ඩී 5 හැෂ් එකකින් සංගීත නිරූපණයක් ලබා ගැනීමේදී වඩා පිරිසිදු වන මෙම විසඳුම සොයා ගන්නා ලදී.

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));
    }
}

කේතය මෙතැනින් උපුටා ගන්නා ලදි .


2
මෙම පිළිතුර -1 සහ අනෙක්, කෙටි හා අඩු විස්තරාත්මක පිළිතුර +146 ඇත්තේ ඇයි?
නිල්සෝර්

4
+1 අගය ලබා ගැනීම සඳහා බිග් ඉන්ටෙගර් භාවිතා කිරීම සතුටක්
ඩේව් බී

5
සමහර අවස්ථාවල මෙය උත්පාදනය කරන්නේ අක්ෂර 31 ක් දිග MD5 එකතුවක් මිස 32 ක් නොවිය යුතු බව
මම දැනගත්තා

3
ov කොවිකා මෙයට හේතුව, මට නිවැරදිව මතක නම් ආරම්භක ශුන්‍යයන් කපා දමනු ලැබේ .. String.format("%032x", new BigInteger(1, hash)); මෙය විසඳිය යුතුය. 'හෑෂ්' යනු හැෂ්හි බයිට් [] වේ.
හේෂාන් පෙරේරා

1
මෙය බෙහෙවින් උසස් බව පෙනේ. ඔබට බොහෝ ව්‍යතිරේකයන් අල්ලා ගැනීමට පවා අවශ්‍ය නැත.
JGFMK

32

තවත් ක්‍රියාත්මක කිරීම:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));

2
බාහිර පුස්තකාලයක් භාවිතා නොකරන මා දුටු එක් ලයිනර් එකක් පමණි.
holmis83

මම වැරදියට තේරුම් නොගත්තොත්, මෙය සෑම විටම ලොකු අකුරින් ලැබෙන අතර එය හෙක්ස් භාවිතා නොකර md5 නිපදවා ඇත. එය සත්‍ය md5 යැයි පවා විශ්වාස නැත
walshie4

2
als walshie4 හෙක්ස් නොමැතිව MD5 නොමැත ( ietf.org/rfc/rfc1321.txt බලන්න ), එය කුඩා අකුරින් ලබා ගැනීම සඳහා .toLower () එකතු කරන්න. ප්‍රති en ල උදා: en.wikipedia.org/wiki/MD5 හි උදාහරණ සමඟ සසඳන්න එවිට ඔබට ජාවාස් පුස්තකාල කේතය නිවැරදි යැයි විශ්වාස කිරීමට වඩා හොඳ අවස්ථාවක් ලැබේ.
ස්ටැකර්

31

තවත් විකල්පයක් වන්නේ ගුවා හැෂිං ක්‍රම භාවිතා කිරීමයි :

Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();

හැන්ඩි ඔබ දැනටමත් ගුවා භාවිතා කරන්නේ නම් (ඔබ එසේ නොවේ නම්, ඔබ එසේ විය යුතුය).


3
හෝ කෙටිමං ක්‍රම වලින් එකක් භාවිතා කිරීම:Hashing.md5().hashString("my string").asBytes();
කර්ට් ඇල්ෆ්‍රඩ් ක්ලුවර්

4
වැනි අක්ෂර කට්ටලයක් ඇතුළු කිරීමට අමතක @KurtAlfredKluever 'Hashing.md5 () hashString ( "මගේ සංගීත", Charsets.UTF_8) .asBytes ().' නැහැ
ජස්ටින්

28

සරල පෙළ හැෂ් ආකාරයෙන් හැඩතල ගැන්වීමට මට පංතියක් (හැෂ්) ඇත: md5 හෝ sha1, 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");
    }
}

JUnit සහ PHP සමඟ පරීක්ෂා කිරීම

PHP පිටපත:

<?php

echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";

ප්‍රතිදාන PHP පිටපත:

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));
    }

}

GitHub හි කේතය

https://github.com/fitorec/java-hashes


EdCedricSimon පැවසූ පරිදි, එය හරියටම මම සොයමින් සිටියෙමි. මෙහි ඉහළට .. ස්තූතියි!
ජෝවාබ් ලුසෙනා

25

එය ඕනෑවට වඩා සංකීර්ණ කිරීමට අවශ්‍ය නැත.
ඩයිජෙස්ටිල්ස් හොඳින් ක්‍රියා කරන අතර md5හැෂ් සමඟ වැඩ කරන විට ඔබට සුවපහසු වේ.

DigestUtils.md5Hex(_hash);

හෝ

DigestUtils.md5(_hash);

එක්කෝ ඔබ වැනි වෙනත් ඕනෑම දත්ත ආරක්ෂණ ක්රමයකි භාවිතා කළ හැකි shaහෝ md.


22

මගේ එතරම් හෙළි නොකරන පිළිතුර:

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)ලොකු අකුරක් තිබීම
ඇලෙක්ස්

17

එහි වේ DigestUtilsපන්තියේ වසන්තය ද:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/DigestUtils.html

මෙම පන්තියේ කාර්යය කරන ක්‍රමය අඩංගු වේ md5DigestAsHex().


BTW: හෙක්ස් ස්ට්‍රිං නිරූපණය නිර්මාණය කිරීම සඳහා බිග් ඉන්ටෙගර් භාවිතා කිරීමෙන් මෙහි ක්‍රියාකාරිත්වය වඩා හොඳය.
ජේම්ස්

17

ඔබට අනුගමනය කිරීමට උත්සාහ කළ හැකිය. විස්තර සහ කේත මෙතැනින් බාගන්න: 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();
}
}

16

බොම්බේගේ පිළිතුර නිවැරදි ය, කෙසේ වෙතත් ඔබ නියත වශයෙන්ම MD5 භාවිතා කළ යුතු නොවේ නම් (උදා: අන්තර් ක්‍රියාකාරිත්වය සඳහා ඔබ මත බල කරනු ලැබේ), වඩා හොඳ තේරීමක් SHA1 වන බැවින් MD5 දිගුකාලීන භාවිතය සඳහා දුර්වලතා ඇත.

SHA1 හි න්‍යායාත්මක දුර්වලතා ඇති නමුත් එය එතරම් දරුණු නොවන බව මම එකතු කළ යුතුය. හැෂින් කිරීමේ වර්තමාන කලාව නම් අපේක්ෂක ප්‍රතිස්ථාපන හැෂ් ශ්‍රිත ගණනාවක් ඇති නමුත් SHA1 ප්‍රතිස්ථාපනය කිරීමේ සම්මත හොඳම ක්‍රමය ලෙස තවමත් කිසිවක් මතු වී නැත. එබැවින්, ඔබගේ අවශ්‍යතා අනුව ඔබේ හැෂ් ඇල්ගොරිතම වින්‍යාසගත කළ හැකි වන පරිදි ඔබට උපදෙස් දෙනු ඇත, එවිට එය අනාගතයේදී ප්‍රතිස්ථාපනය කළ හැකිය.


එක් එක් අයගේ සාපේක්ෂ කුසලතා සහ දුර්වලතා ගැන මට කියවිය හැකි සමහර සම්පත් වෙත මා යොමු කළ හැකිද?
අක්ෂේ

මේ මොහොතේ ඔබට කළ හැකි හොඳම දේ SHA1 භාවිතා කර අනාගතයේදී එය ප්‍රතිස්ථාපනය කිරීමට සූදානම්ව සිටීමයි. ඔබට නව කාර්යයන් භාවිතා කළ හැකි නමුත් ඒවා තවමත් විශාල පර්යේෂණවලට භාජනය වී නොමැත. මෙය වෙනස් වන්නේ කවදාදැයි සොයා ගැනීමට ඔබට මාර්ගගත ආරක්ෂක සම්පත් නිරීක්ෂණය කළ හැකිය - උදාහරණයක් ලෙස බ ru ස් ෂ්නෙයර්ගේ බ්ලොගය.
frankodwyer

7
ඔබට ගුප්ත විද්‍යාත්මකව ආරක්ෂිත හැෂ් එකක් අවශ්‍ය නොවන්නේ නම් SHA1 අධික ලෙස මරණයට පත් වේ, එනම් මුල් පණිවිඩය ප්‍රතිනිර්මාණය කිරීම සඳහා හැෂ් උදව් කිරීමට ඔබට අවශ්‍ය නැත, එසේම දක්ෂ ප්‍රහාරකයෙකු හැෂ් හා ගැලපෙන වෙනත් පණිවිඩයක් නිර්මාණය කිරීමට ඔබට අවශ්‍ය නැත. මුල් පිටපත රහසක් නොවේ නම් සහ ආරක්ෂාව සඳහා හැෂ් භාවිතා නොකරන්නේ නම්, MD5 වේගවත් හා පහසුය. උදාහරණයක් ලෙස, ගූගල් වෙබ් මෙවලම් කට්ටලය ජාවාස්ක්‍රිප්ට් URL වල MD5 හැෂ් භාවිතා කරයි (උදා: foo.js? Hash = 12345).
ඩේවිඩ් ලෙපික්

12

තවත් ක්‍රියාත්මක කිරීම: ජාවා හි වේගවත් MD5 ක්‍රියාත්මක කිරීම

String hash = MD5.asHex(MD5.getHash(new File(filename)));

1
මෙය අවම පරායත්තතා සහිත stand න, ස්වාධීන පුස්තකාලයකි. හොඳ දේවල්.
අජැක්ස්

මම එය ඉතා ප්රයෝජනවත් විය. 4.57GB ගොනුවක් සඳහා එම්එස් 15357 ක් ගත වූ අතර ජාවා ඉන්බිල්ට් ක්‍රියාවට නැංවීම 19094 එම්එස්.
bkrish

11

මෙය කියවන ඕනෑම කෙනෙකුට මෙය අදාළ දැයි මම නොදනිමි, නමුත් මට අවශ්‍ය ගැටලුව මට තිබුණි

  • දී ඇති URL එකකින් ගොනුවක් බාගන්න සහ
  • එහි MD5 දන්නා අගයකට සංසන්දනය කරන්න.

මට එය කිරීමට අවශ්‍ය වූයේ JRE පන්ති සමඟ පමණි (Apache Commons හෝ ඊට සමාන නැත). ඉක්මන් වෙබ් සෙවුමක් මඟින් නියැදි කේත ස්නිපෙට් දෙකම එකවර කරන බවක් මට නොපෙන්වයි , එක් එක් කාර්යය වෙන වෙනම. මේ සඳහා එකම ගොනුව දෙවරක් කියවීමට අවශ්‍ය බැවින්, කාර්යයන් දෙකම ඒකාබද්ධ කරන කේතයක් ලිවීම වටී යැයි මම සිතුවෙමි, ගොනුව බාගත කරන අතරතුර මැස්ස මත චෙක්සම් ගණනය කරන්න. මෙය මගේ ප්‍රති result ලයයි (සමාවෙන්න එය පරිපූර්ණ ජාවා නොවේ නම්, නමුත් ඔබට කෙසේ හෝ අදහස ලැබෙනු ඇතැයි මම සිතමි):

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)
        );
}

1
ඔහ් බීටීඩබ්ලිව්, මා හැර වෙන කිසිවෙකුට මගේ ජේආර්ඊ දැනුම කොතරම් නරකදැයි දැන ගැනීමට පෙර: මම ඩයිජෙස්ට් ඉන්පුට්ස්ට්රීම් සහ ඩයිජෙස්ට් ඕට්පුට්ස්ට්රීම් සොයා ගත්තා . මම දැන් ඉගෙනගෙන ඇති දේ පිළිබිඹු කිරීම සඳහා මගේ මුල් විසඳුම සංස්කරණය කිරීමට යන්නෙමි.
kriegaex

7

PHP මෙන් නොව md5 ශ්‍රිතය ඇමතීමෙන් ඔබේ පෙළෙහි MD5 හැෂිං එකක් කළ හැකිය md5($text), එනම් ජාවා හි එය ටිකක් සංකීර්ණ විය. මම සාමාන්‍යයෙන් එය ක්‍රියාත්මක කළේ md5 හෑෂ් පෙළ නැවත ලබා දෙන ශ්‍රිතයක් ඇමතීමෙනි. මෙන්න මම එය ක්‍රියාත්මක කළ ආකාරය, පළමුව md5hashingපහත දැක්වෙන පරිදි ඔබේ ප්‍රධාන පන්තිය තුළ නම් කරන ලද ශ්‍රිතයක් සාදන්න .

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;     
    }

පහත දැක්වෙන පරිදි ඔබට අවශ්‍ය විටෙක ශ්‍රිතය අමතන්න.

String text = textFieldName.getText();
String pass = md5hashing(text);

PHP හි md5 හැෂිං සමඟ ගැලපෙන පරිදි හැෂ් ටෙක්ස්ට් බිංදුවක් සමඟ එකතු කර ඇති බව මෙහිදී ඔබට දැක ගත හැකිය.



6

එය වටින දෙය සඳහා, COM සංරචක ස්ථාපනය කරන වැඩසටහනක් සඳහා ස්වාභාවික යතුරකින් GUID සංස්ලේෂණය කිරීමට අවශ්‍ය නිසා මම මෙය පැකිලීමි; GUID ජීවන චක්‍රය කළමනාකරණය නොකිරීමට මට සංයුක්ත කිරීමට අවශ්‍යයි. මම MD5 භාවිතා කර UUID පන්තිය භාවිතා කර එයින් නූලක් ලබා ගනිමි. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 මෙම ගැටළුව මතු කරයි).

ඕනෑම අවස්ථාවක, java.util.UUID ඔබට MD5 බයිට් වලින් ලස්සන සංගීතයක් ලබා ගත හැකිය.

return UUID.nameUUIDFromBytes(md5Bytes).toString();

ඇත්ත වශයෙන්ම එය පිළිගන්නේ MD5 බයිට් අරා පමණක් නොවේ (ප්‍රමාණය == 16). ඔබට ඕනෑම දිගකින් බයිට් අරා සමත් විය හැකිය. එය MD5 මාර්ගයෙන් MD5 බයිට් අරා බවට පරිවර්තනය වේ MessageDigest( nameUUIDFromBytes () ප්‍රභව කේතය බලන්න )
Lu55

6
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();

5

ඔබට හොඳම ආරක්ෂාව අවශ්‍ය නොවන්නේ නම් MD5 ඉතා හොඳයි, ඔබ ගොනු අඛණ්ඩතාව පරීක්ෂා කිරීම වැනි දෙයක් කරන්නේ නම් ආරක්ෂාව සලකා බැලිය යුතු නොවේ. එවැනි අවස්ථාවකදී ඔබට ජාවා පුස්තකාලවල සහය දක්වන ඇඩ්ලර් 32 වැනි සරල හා වේගවත් යමක් සලකා බැලීමට අවශ්‍ය විය හැකිය.


2
ලිපිගොනු අඛණ්ඩතාව ආරක්ෂක ගැටළුවක් නොවන බව ඔබ සිතන්නේ කුමක් ද?
ජෙරමි හුයිස්කාම්ප්

5

මෙය mysql හි md5 ශ්‍රිතයෙන් හෝ php හි md5 ශ්‍රිත වලින් ලබා ගන්නා ආකාරයටම md5 ලබා දෙයි. මෙය මම භාවිතා කරන ක්‍රමයයි (ඔබේ අවශ්‍යතා අනුව ඔබට වෙනස් විය හැකිය)

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;            
    }

}

4

මේක උත්සාහ කරන්න:

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 "";
    }
}

2
ප්‍රමුඛ ශුන්‍යයන් ඉවත් කරන බැවින් මෙය බොහෝ විට නරකම විසඳුම වේ.
ජැනික්

4
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)

1
මෙය කොට්ලින් භාෂාවද?
ඉසුරු

3
S ඉසුරු ස්කලා වගේ
ගිල්ඩර්

4

පැකේජයේ ඇති පන්තියේ ක්‍රම භාවිතා කිරීමෙන් ඔබට දී ඇති පෙළක් සඳහා MD5 හෑෂ් උත්පාදනය කළ හැකිය . පහත දැක්වෙන්නේ සම්පූර්ණ කේත ස්නිපටය,MessageDigestjava.security

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 ශ්‍රිතයේ ප්‍රතිදානය ෂඩාස්රාකාර සංඛ්‍යා 32 කින් නියෝජනය වන බිට් 128 හැෂ් වේ.

ඔබ MySQL වැනි දත්ත සමුදායක් භාවිතා කරන්නේ නම්, ඔබට මෙය වඩාත් සරල ආකාරයකින් කළ හැකිය. විමසුම Select MD5(“text here”)වරහනෙහි ඇති පෙළෙහි MD5 හැෂ් නැවත ලබා දෙනු ඇත.


2

මෙය මා මෙහි පැමිණියේ- MD5 හෑෂ් නූල් නැවත ලබා දෙන පහසු පරිමාණ ශ්‍රිතයක් සඳහා ය:

def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}

0
 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));
 }
}

ඒ ගැන කෝඩින්කිට් පිළිබඳ ලිපියක් තිබේ. පරීක්ෂා කරන්න: http://codingkit.com/a/JAVA/2013/1020/2216.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.