本文共 12813 字,大约阅读时间需要 42 分钟。
是否有任何方法可以在Java中生成字符串的哈希?
我的答案不是很清楚:
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;}
发现此解决方案从MD5哈希中获取String表示形式方面更为简洁。
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)); }}
代码是从提取的。
我不知道这与阅读本文的人是否相关,但是我只是遇到了我想解决的问题
我只想用JRE类来做(不使用Apache Commons或类似的东西)。 一个快速的网络搜索没有显示我的示例代码片段在同一时间分别做两个 ,只有每个任务。 因为这需要两次读取相同的文件,所以我认为写一些代码来统一这两个任务,并在下载文件时动态计算校验和,可能是值得的。 这是我的结果(很抱歉,如果它不是完美的Java,但我想您还是会想到的):
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; // newimport 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) );}
也有一个DigestUtils
类:
此类包含执行该工作的方法md5DigestAsHex()
。
对于它的价值,我偶然发现了这一点,因为我想从自然键为要安装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哈希值时感到舒适。
DigestUtils.md5Hex(_hash);
要么
DigestUtils.md5(_hash);
您可以使用任何其他加密方法,例如sha或md。
另一种选择是使用 :
Hasher hasher = Hashing.md5().newHasher();hasher.putString("my string");byte[] md5 = hasher.hash().asBytes();
如果您已经在使用番石榴,则非常方便(如果没有,则应该使用)。
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)); }}
关于Codingkit的文章。 检出: :
您可以尝试关注。 在此处查看详细信息和下载代码: :
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();}}
另一个实现:
import javax.xml.bind.DatatypeConverter;String hash = DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
我有一个Class(Hash)以以下格式转换哈希中的纯文本:md5或sha1,类似php的函数( , ):
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"); }}
MD5 :b10a8db164e0754105b7a99be72e3fe5SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0
public class HashTest { @Test public void test() { String txt = "Hello World"; assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt)); assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt)); }}
尝试这个:
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 ""; }}
我发现这是最清晰,最简洁的方法:
MessageDigest md5 = MessageDigest.getInstance("MD5");md5.update(StandardCharsets.UTF_8.encode(string));return String.format("%032x", new BigInteger(1, md5.digest()));
这就是我来到这里的一个方便的scala函数,该函数返回MD5哈希的字符串:
def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
与PHP不同,在PHP中,您只需调用md5函数即md5($text)
对文本进行MD5哈希处理,这在Java中变得有点复杂。 我通常通过调用返回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);
在这里,您可以看到hashtext附加了零,以使其与PHP中的md5哈希匹配。
这是您从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; }}
这是我的用法:
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));
十六进制为: org.apache.commons.codec.binary.Hex
。
import java.security.MessageDigestval digest = MessageDigest.getInstance("MD5")//Quick MD5 of textval text = "MD5 this text!"val md5hash1 = digest.digest(text.getBytes).map("%02x".format(_)).mkString//MD5 of text with updatesdigest.update("MD5 ".getBytes())digest.update("this ".getBytes())digest.update("text!".getBytes())val md5hash2 = digest.digest().map(0xFF & _).map("%02x".format(_)).mkString//Outputprintln(md5hash1 + " should be the same as " + md5hash2)
您需要 。
调用以获取您可以使用的MessageDigest
的MD5实例。
通过执行以下操作之一来计算哈希:
byte[]
输入,并使用在一次操作中计算哈希值。 MessageDigest
一个byte[]
块。 添加完输入字节后,请使用计算哈希值。 md.digest()
返回的byte[]
是MD5哈希值。
MessageDigest
类可以为您提供MD5摘要的实例。
使用字符串和crypto类时,请务必始终指定要使用字节表示形式的编码。如果仅使用string.getBytes()
,它将使用平台默认值。 (并非所有平台都使用相同的默认值)
import java.security.*;..byte[] bytesOfMessage = yourString.getBytes("UTF-8");MessageDigest md = MessageDigest.getInstance("MD5");byte[] thedigest = md.digest(bytesOfMessage);
如果您有大量数据,请查看.update(byte[])
方法,该方法可以重复调用。 然后调用.digest()
以获取结果哈希。
Bombe的答案是正确的,但是请注意,除非您绝对必须使用MD5(例如,为实现互操作性而强加于您),否则SHA1是更好的选择,因为MD5在长期使用方面存在弱点。
我应该补充一点,SHA1也有理论上的漏洞,但没有那么严重。 哈希技术的当前水平是,有许多候选替换哈希函数,但是还没有一种方法成为替换SHA1的标准最佳实践。 因此,根据您的需求,建议您将哈希算法配置为可配置的,以便将来可以替换。
您可能还需要查看apache 项目的类,该类提供了非常方便的方法来创建MD5或SHA摘要。
看一下以下链接,该示例获取了提供的图像的 :图像的
如果您实际上希望答案以字符串而不是字节数组的形式返回,则始终可以执行以下操作:
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;}
如果您不需要最佳的安全性,那么MD5就是完美的选择,如果您正在执行类似检查文件完整性的操作,那么就不必考虑安全性了。 在这种情况下,您可能需要考虑一些更简单,更快捷的方法,例如Java库也支持的Adler32。
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();
另一个实现:
String hash = MD5.asHex(MD5.getHash(new File(filename)));
您可以通过使用java.security
包中MessageDigest
类中的方法为给定的文本 。 以下是完整的代码段,
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哈希值。
发现了这一点:
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;}
在下面的网站上,我对此一无所知,但是它是可行的解决方案! 对我来说,许多其他代码无法正常工作,我最终在哈希中缺少0。 这似乎与PHP相同。 来源: :
我刚刚下载了并获得了像md5这样的完美php。 这是 。
只需将其导入您的项目并使用
String Url = "your_url";System.out.println( DigestUtils.md5Hex( Url ) );
就在那里。
转载地址:http://baogj.baihongyu.com/