Kotlin 消息摘要

常用算法: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文件,摘要结果都是固定长度
发布了383 篇原创文章 · 获赞 54 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/hongxue8888/article/details/103851854