消息摘要Md5、sha1、sha256
消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。 消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这串摘要便可成为验证明文是否是"真身"的"指纹"了。链接: 360百科_消息摘要.
在IDEA中新建一个kotlin项目:
package com.hlping.study
import java.lang.StringBuilder
import java.security.MessageDigest
object ch8_MessageDigetUtil {
/**
* 消息摘要Md5
* 1、加密后16个字节
* 2、加密后转成16进制为32个字节
* 3、消息摘要加密后的结果是固定长度,且无法解密(不可逆)
*/
fun Md5(input:String): String {
val digest = MessageDigest.getInstance("MD5")
val result = digest.digest(input.toByteArray())
println(result.size)
return toHex(result)
}
/**
* 消息摘要sha1
* 1、加密后20个字节
* 2、加密后转成16进制为40个字节
* 3、消息摘要加密后的结果是固定长度,且无法解密(不可逆)
*/
fun Sha1(input: String):String{
val digest = MessageDigest.getInstance("SHA-1")
val result = digest.digest(input.toByteArray())
println(result.size)
return toHex(result)
}
/**
* 消息摘要sha256
* 1、加密后32个字节
* 2、加密后转成16进制为64个字节
* 3、消息摘要加密后的结果是固定长度,且无法解密(不可逆)
*/
fun Sha256(input: String):String{
val digest = MessageDigest.getInstance("SHA-256")
val result = digest.digest(input.toByteArray())
println(result.size)
return toHex(result)
}
fun toHex(byteArray: ByteArray):String{
return with(StringBuilder()){
//转成16进制
byteArray.forEach {
// println(it)
val hex = it.toInt() and (0xFF)
val hexString = Integer.toHexString(hex)
// println(hexString)
if (hexString.length==1){
append("0").append(hexString)
}else{
append(hexString)
}
}
toString()
}
}
}
fun main(args: Array<String>) {
val input="hello kotlin!"
val md5 = ch8_MessageDigetUtil.Md5(input)
println("md5加密=$md5")
println("md5加密转HEX进制后的长度=" + (md5.toByteArray().size).toString())
val sha1 = ch8_MessageDigetUtil.Sha1(input)
println("sha1加密=$sha1")
println("sha1加密转HEX进制后的长度=" + (sha1.toByteArray().size).toString())
val sha256 = ch8_MessageDigetUtil.Sha256(input)
println("sha256加密=$sha256")
println("sha256加密转HEX进制后的长度=" + (sha256.toByteArray().size).toString())
}
输出:
> Task :Ch8_MessageDigetUtilKt.main()
16
md5加密=c8a0e36b1b331004235bc527fa9bd3f6
md5加密转HEX进制后的长度=32
20
sha1加密=143dd339929eadc4f523235bc2756cbda3b04989
sha1加密转HEX进制后的长度=40
32
sha256加密=87ca7563e6ee556a223b64cefe225b41f24d64262b8ea81630c5127d77d6af0b
sha256加密转HEX进制后的长度=64