第九章 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.数字签名流程图
数字签名流程图
总结
以上就是今天要讲的内容,本文仅仅简单介绍了数字签名知识。