常用算法:md5、sha1、sha256
特点:不可逆(加密后无法破解)
应用场景:
1. 对用户密码进行md5加密后保存到数据库里
2. 软件下载站使用消息摘要计算文件指纹,防止被篡改
3. 数字签名
/**
* 消息摘要
*/
object MessageDigetUtil {
fun md5(input: String): String {
val digest = MessageDigest.getInstance("MD5")
val result = digest.digest(input.toByteArray())
// println("md5加密长度="+result.size)
//val stringBuilder = StringBuilder()
//转成16进制
/*result.forEach {
val value = it
val hex = value.toInt() and (0xFF)
val hexStr = Integer.toHexString(hex)
println(hexStr)
if(hexStr.length == 1){
stringBuilder.append("0").append(hexStr)
}else{
stringBuilder.append(hexStr)
}
}
return stringBuilder.toString()*/
return toHex(result)
}
fun sha1(input: String): String {
val digest = MessageDigest.getInstance("SHA-1")
val result = digest.digest(input.toByteArray())
println("sha1加密后=" + result.size)
//转成16进制
val toHex = toHex(result)
println("sha1加密后转成16进制=" + toHex.toByteArray().size)
return toHex
}
fun sha256(input: String): String {
val digest = MessageDigest.getInstance("SHA-256")
val result = digest.digest(input.toByteArray())
println("sha256加密后=" + result.size)
//转成16进制
val toHex = toHex(result)
println("sh256加密后转成16进制=" + toHex.toByteArray().size)
return toHex
}
//转成16进制
fun toHex(byteArray: ByteArray): String {
//高阶函数
val result = with(StringBuilder()) {
//转成16进制
byteArray.forEach {
val value = it
val hex = value.toInt() and (0xFF)
val hexStr = Integer.toHexString(hex)
//println(hexStr)
if (hexStr.length == 1) {
append("0").append(hexStr)
} else {
append(hexStr)
}
}
this.toString()
}
return result
}
}
fun main(args: Array<String>) {
val input = "黑马程序员黑马程序员黑马程序员黑马程序员"
/* val digest = MessageDigest.getInstance("MD5")
val result = digest.digest(input.toByteArray())
val stringBuilder = StringBuilder()
//转成16进制
result.forEach {
val value = it
val hex = value.toInt() and (0xFF)
val hexStr = Integer.toHexString(hex)
println(hexStr)
if(hexStr.length == 1){
stringBuilder.append("0").append(hexStr)
}else{
stringBuilder.append(hexStr)
}
}*/
//md5:16,32
val md5 = MessageDigetUtil.md5(input)
println(md5)
println(md5.toByteArray().size)
//32
println("tomcat=" + "827fb063bcac90d9a5ce0e9397041e92".toByteArray().size)
val sha1 = MessageDigetUtil.sha1(input)
println(sha1)
val sha256 = MessageDigetUtil.sha256(input)
println("sha256=" + sha256)
}
46cf5c5d1f199d517a43d6af2ba3ddaa
32
tomcat=32
sha1加密后=20
sha1加密后转成16进制=40
c507efb7db3d4d826d0db7da56848fec3f058dad
sha256加密后=32
sh256加密后转成16进制=64
sha256=2f12c8251bbe06c7cca6758196540f2d427a66461fdf4928d72f6205d964102b
消息摘要md5
- 加密后16字节
- 加密后转成16进制 32字节
- 消息摘要后的结果是固定长度,无论你的数据有多大,即使一个G文件,摘要结果都是固定长度