第九章 kotlin-数字签名

第九章 kotlin-数字签名



前言

kotlin-数字签名。
算法:SHA256withRSA,消息摘要+非对称加密
特点:私钥签名,公钥校验。
应用场景:校验数据完整性,例如支付参数被篡改。


一、数字签名简介

1.含义

数字签名是非对称加密与消息摘要的组合应用

2.应用场景

  • 1.校验用户身份(使用私钥签名,公钥校验,只要用公钥能校验通过,则该信息一定是私钥持有者发布的)
  • 2.校验数据的完整性(用解密后的消息摘要跟原文的消息摘要进行对比)

二、数字签名代码示例

1.数字签名代码示例

RSACrypt.kt

package com.example.lib1.crypt

import java.security.Key
import java.security.KeyPairGenerator
import java.util.*

object RSACrypt {
    val generator = KeyPairGenerator.getInstance("RSA")//秘钥对生成器
    val keyPair = generator.genKeyPair()//生成秘钥对
    val publicKey = keyPair.public//公钥
    val privateKey = keyPair.private//私钥
    //val publicKeyStr = Base64.getEncoder().encode(publicKey.encoded)
    //val privateKeyStr = Base64.getEncoder().encode(privateKey.encoded)
}

SignatureDemo.kt

package com.example.lib1.crypt

import com.example.lib1.encryptTest.RSACrypt
import java.security.PrivateKey
import java.security.PublicKey
import java.security.Signature
import java.util.*

/**
 * 数字签名
 */
object SignatureDemo {
    /**
     * 签名
     */
    fun sign(privateKey: PrivateKey, input: String): String {
//        val input = "name=iPhone8&price=100"
//        var privateKey = RSACrypt.privateKey
        //获取数字签名实例对象
        val signature = Signature.getInstance("SHA256withRSA")
        //初始化签名
        signature.initSign(privateKey)
        //设置数据源
        signature.update(input.toByteArray())
        //签名
        val sign = signature.sign()
        println(Base64.getEncoder().encodeToString(sign))
        return Base64.getEncoder().encodeToString(sign)
    }

    /**
     * 校验:校验参数是否被修改
     */
    fun verify(input: String, publicKey: PublicKey, sign: String): Boolean {
        val signature = Signature.getInstance("SHA256withRSA")
        //初始化签名校验
        signature.initVerify(publicKey)
        //设置数据源
        signature.update(input.toByteArray())
        //校验签名信息
        val verify = signature.verify(Base64.getDecoder().decode(sign))
        println("verify 校验="+verify)
        return verify
    }

}


fun main(agrs:Array<String>) {
    val input = "name=iPhone8&price=100"
    var privateKey = RSACrypt.privateKey
    var publicKey = RSACrypt.publicKey
    val sign = SignatureDemo.sign(privateKey,input)

    println("签名="+sign)

    //------------------校验:校验参数是否被修改------------------
    val verify = SignatureDemo.verify("name=iPhone8&price=100",publicKey,sign) //参数未被修改
//    val verify = SignatureDemo.verify("name=iPhone8&price=10",publicKey,sign) //参数被修改
    println("校验="+verify)

}

三、数字签名流程图

1.数字签名流程图

数字签名流程图

数字签名流程图


总结

以上就是今天要讲的内容,本文仅仅简单介绍了数字签名知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值