Byronsh博客的数字签名的验证方法

英文标题: signature verification process for digital signature of Byronsh's blog

本博主部分博客带有会加数字签名。

签名算法为SHA512+RSA4096,只对文本部分做了签名。

RSA4096 的公钥如下:

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnrJo0wOPcH+ZeAb+UsGh
yHhPRiV4sox4aUf2SDHZVfCGUcpZJZQ5pi3QK0lNX4WuaBZ1HquhtU5s7uKqaJlf
mb1gGCJOG17bHACJV143XR+T7VQe9UmBBp8gpBbEsdYg9+4TJCti8vmDvfz0meJF
q9De5n9Uk2J2Gt2UQX+dpru8FnDmlI8AIt3eAyfJnY6XB4y9GymuXbyj6R238a6T
3udc7gK+50CgxVylBO5ANJ9YYDLkGv++9mAODlKXuE/xtG7XNXrTQ0f+NrlrRmDQ
qCFmAYK8GdT0eKkkT4gHBah7wYEVpw9iOcHzVpajp7vsMe33qO3IpMTFpJ+TkZd9
H/7gQ6Hu5QPzv236Ym4nLAVtLOxx2iCN2cXT7cmkGas/9oDrYx1TdAW0VSk9PA2H
KRKZOdy9XYNAN9HOTZcy8YfpLv5CN5OnA+Qpca3XHD3Xf2kYafV0hdMuhBY7EP4y
yAxQt6Ug+9qWE4jJg5lh6jSbuMdfqO2a2JjZCh5Z4PrX+Cdnh6r1rV7lvSFZmyWY
gsAuzGh2zip9FY/3Pdy+Y0Xb4PbvNWcc+R8LxF0PrFwwbiYRyC+tGPvUCQIyTHYd
PMwNqcuxVh2X/WqcK6YVHUmlo6wDsJIMONDPzFTnM4VdhB1KgA5I0awzf6UuGBug
X44OVTtMBuksYdiydc9wVokCAwEAAQ==
-----END PUBLIC KEY-----

下面的工具是博主生成签名和验证签名的工具,基于 javascripthtml

验证签名的步骤 (windows中):

1 新建一个文本文件,以.txt为后缀的文件。
2 将下面的代码拷贝到文本文件中
3 将文件后最 .txt改为.html
4 双及文件,用浏览器打开
5 将博客除去签名部分的正文拷贝到“文本”下面的编辑栏中。(注意:不要拷贝标题和博客结尾处的签名)
6 将签名拷贝到“签名”下的编辑框中
7 公钥已经默认添在“公钥”下的编辑框中,保持不变;
8 对于验证数字签名,“私钥”不起作用,“私钥“下的编辑框保持不变;
9 点击最下方的按钮“验证签名”,然后会弹出验证结果。

给博客加个签名的目的,是防止某些人转载后随意篡改,但是又没有证据证明。同时最近也在学密码学相关知识,也顺便拿来用一用 :)

可能存在的问题

1 同样的博客,不同浏览器复制得到的文本可能会不一样,从而导致验签失败。 本博主博客的数字签名都是在火狐浏览上生成和测试过的。

<!--
Copyright 2019 byronsh https://www.cnblogs.com/byronsh/

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<!DOCTYPE HTML>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <title>数字签名生成/验证</title>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jsrsasign/8.0.12/jsrsasign-all-min.js"></script>
<script>

/* 
 * function generateSignature()
 * 功能: 生成数字签名
 */
function generateSignature(){
  //1. 获取需要签名的文本
  var plain_text = document.getElementById("input").value;
  //为了减小网页排版导致的签名验证失败,删除所有的空字符(空格,换行符,制表符等等)
  plain_text_trim = plain_text.replace(/\s*/g, "");

  //2. 用私钥签名
  //2.1 获取公钥 
  var prk = document.getElementById("prk").value;
  var sign_key = KEYUTIL.getKey(prk);
  //2.2 创建签名对象
  let signature = new KJUR.crypto.Signature({alg:"SHA512withRSA"});

  //2.3 初始化签名对象的钥匙和需要签名的文本
  signature.init(sign_key);
  signature.updateString(plain_text_trim);
  //2.4 进行签名
  let a = signature.sign();
  let sign = hextob64(a);
  //2.5 将签名更新进网页的文本框
  document.getElementById("signature").value = sign + "\n------End Signature------" + getDateTime();
  
  //3. 提醒用户签名完成
  document.getElementById("result").innerText = getDateTime() + " 签名成功。\n" ;
};

/* 
 * function verifySignature()
 * 功能: 验证数字签名
 */
function verifySignature(){
  //1. 获取需要验证数字签名的文本及其签名
  //1.1 获取文本
  var plain_text = document.getElementById("input").value;
  //为了减小网页排版导致的签名验证失败,删除所有的空字符(空格,换行符,制表符等等)
  var plain_text_trim = plain_text.replace(/\s*/g, "");
  //1.2 获取签名
  var signature = document.getElementById("signature").value;
  signature = signature.replace(/\n------End Signature------.*/,"");

  //2. 用公钥验证签名
  //2.1 获取公钥
  var puk = document.getElementById("puk").value;
  var verify_key = KEYUTIL.getKey(puk);
  //2.2 创建签名对象
  let signatureVf = new KJUR.crypto.Signature({alg:"SHA512withRSA"});
  //2.3 初始化签名对象的钥匙和需要签名的文本
  signatureVf.init(verify_key);
  signatureVf.updateString(plain_text_trim);
  //2.4 验证签名
  let b = signatureVf.verify(b64tohex(signature));

  //3. 告知用户验签结果
  if(true == b){
    alert("签名 有效。");
    document.getElementById("result").innerHTML = "<p>" + getDateTime() + "  签名<b style='color:green'>有效<b></p>";
  }
  else{
    alert("签名 无效!!");
    document.getElementById("result").innerHTML = "<p>" + getDateTime() + "  签名<b style='color:red'>无效<b></p>";
  }
};

function getDateTime()
{
  var now = new Date();
  var year = now.getFullYear();
  var month = now.getMonth()+1;
  var date = now.getDate();
  var day = now.getDay();
  var hour = now.getHours();
  var minute = now.getMinutes();
  var second = now.getSeconds();

  var  dateTime = year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
  return dateTime;
};

</script>
  </head>    

  <body>
    <div>
      <label for="input">文本:</label><br>
      <textarea id="input" name="input"  class=""></textarea><br>

      <label for="prk">私钥:</label><br>
      <textarea id="prk" name="prk"  class=""></textarea><br>

      <label for="puk">公钥:</label><br>
      <!--下面是用于验证byronsh博客文章数字签名默认公钥-->
      <textarea id="puk" name="puk"  class="">
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnrJo0wOPcH+ZeAb+UsGh
yHhPRiV4sox4aUf2SDHZVfCGUcpZJZQ5pi3QK0lNX4WuaBZ1HquhtU5s7uKqaJlf
mb1gGCJOG17bHACJV143XR+T7VQe9UmBBp8gpBbEsdYg9+4TJCti8vmDvfz0meJF
q9De5n9Uk2J2Gt2UQX+dpru8FnDmlI8AIt3eAyfJnY6XB4y9GymuXbyj6R238a6T
3udc7gK+50CgxVylBO5ANJ9YYDLkGv++9mAODlKXuE/xtG7XNXrTQ0f+NrlrRmDQ
qCFmAYK8GdT0eKkkT4gHBah7wYEVpw9iOcHzVpajp7vsMe33qO3IpMTFpJ+TkZd9
H/7gQ6Hu5QPzv236Ym4nLAVtLOxx2iCN2cXT7cmkGas/9oDrYx1TdAW0VSk9PA2H
KRKZOdy9XYNAN9HOTZcy8YfpLv5CN5OnA+Qpca3XHD3Xf2kYafV0hdMuhBY7EP4y
yAxQt6Ug+9qWE4jJg5lh6jSbuMdfqO2a2JjZCh5Z4PrX+Cdnh6r1rV7lvSFZmyWY
gsAuzGh2zip9FY/3Pdy+Y0Xb4PbvNWcc+R8LxF0PrFwwbiYRyC+tGPvUCQIyTHYd
PMwNqcuxVh2X/WqcK6YVHUmlo6wDsJIMONDPzFTnM4VdhB1KgA5I0awzf6UuGBug
X44OVTtMBuksYdiydc9wVokCAwEAAQ==
-----END PUBLIC KEY-----
      </textarea><br>

      <label for="signature">签名:</label><br>
      <textarea id="signature" name="signature"  class=""></textarea><br>
    </div>

    <div>
      <button id="btnGenSig" onclick="generateSignature()">生成签名</button>
      <button id="btnVeriSig" onclick="verifySignature()">验证签名</button>
      <p id="result">请点击按钮“验证签名”或“生产签名”</p>
    </div>
  </body>
</html>

版权声明:本文为博主原创,允许转载但必须注明原文地址。博客原文:https://www.cnblogs.com/byronsh/p/blog-signature-verification.html


本文的数字签名如下:
NoOKu/IqH7vLO0QS46e4Oe7VbhJJ2gUNy1BIC1FaptiJfrIHRlWj9m/nUvym63yndyc0nWlVKSvgOJ8ZOYPSXANlyJzKHs1wFrxeMOzr3/8YbkVIQeEuNw3ZYZZogE6xF2cdT9obub29/jMlaXCm6ASVyGXXkaNvDOzsOy20qqPlnHHmKFERHYWxF3RoXGprwhFpc/o5/hj4ZiwsnZjaO58NaaZUiTn2c838ZRdC032i5wrAmmhVJdwWwPPSFRI85FHJrz4UJKkcYyM/ZSkOHm2tBZDjgPIaDk5KLHLoxLc1k0+3JpfWq2H9LeS8Ju80+g1aP0pzKU0ieq4IXAQQt8IzuLvGXxZotUOZArBaZ0LQZNaIiltuZcfH/AZ3Expc/wzgZOb8o5C64yLO5ck7iybRzom1ieVzCIsYdBjy04OBRbQgR1mFw3r7RGuorNDfXOFqIsQdYMLvdwskJzIGNwWcr6gus/nTCpBsWumvAaW9BgVensBdsFxmuMevolX6OWMsEuQV4hshHH7tJHIeQZ6Xh5Q9rjdws/qQ7uVTEnGki+636R6utMAQ+Bvewf0O0sCa6mKUCjQkJJOllDGzuTw14BX/gh9R3XzYiCdO1obWKTlW+7MbY39WCj2g4+7XCPa+3k3fQgE9n/k/allZMg3eEdfPSeM+anD23mYY5fE=
------End Signature------2019-7-14

数字签名验证方法

猜你喜欢

转载自www.cnblogs.com/byronsh/p/blog-signature-verification.html