• 使用安当UKEY做登录验证


    (windows版)

    1,需要安装安当中间件,

    2,在前端页面引用usbkey.js,这里含有获取UKEY中得编号,公钥等信息以及存用户信息

    (注:使用UKEY之前,需要把UKEY得公钥存到数据库中,与用户对应,也需要把用户得主键存到UKEY中,这里需要单独后台管理员页面操作)

    3,在登录过程中,先获取UKEY得主键信息(前端页面获取),把主键信息传到后台,根据主键信息在数据库查询,判断是否有此用户数据。

    4,有用户数据时,则可获取用户对应得公钥信息,则进行验签操作

      首先,在前台获取随机数,根据随机数生成得签名(这里生成签名的过程是调用安当的方法生成的),把这两个值传到后台中;

      然后,在后台获取用户的公钥,对其进行验签,只有验签成功才能进行登录。不成功时会有提示。

      其验签操作如下: 

        验签的流程
                1》sha256加密原始随机数(明文)获得摘要
                2》公钥解密  base64解码签名后的数据 获得摘要
                3》比较摘要内容是否相同
        后台需求及代码
          1》在后台需要引入 RSAExtensions   NuGet包
          2》后台代码
          

          byte[] SJS = sha256("随机数");
          string Sha256_abstract = BitConverter.ToString(SJS ); //sha256加密原始随机数(明文)获得摘要 

         
          byte[] sign = Convert.FromBase64String("签名");

          byte[] ret = DecryptByPublicKey(sign, "公钥");

          string PublicKey_abstract= BitConverter.ToString(ret); //公钥解密  base64解码签名后的数据 获得摘要

          最后比对 Sha256_abstract 与PublicKey_abstract即可,相同则说明验签成功。

          用到的方法:

          sha256加密方法

          public static byte[] sha256(string data)

          {
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            byte[] hash = SHA256Managed.Create().ComputeHash(bytes);

            return hash;

          }

          RSA公钥解密方法

          private static AsymmetricKeyParameter GetPublicKeyParameter(string s) 
          {
            s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "");
            byte[] publicInfoByte = Convert.FromBase64String(s);
            Asn1Object pubKeyObj = Asn1Object.FromByteArray(publicInfoByte);//这里也可以从流中读取,从本地导入
            AsymmetricKeyParameter pubKey = PublicKeyFactory.CreateKey(publicInfoByte);
            return pubKey;
          }
          public static byte[] DecryptByPublicKey(byte[] byteData, string key)
          {
            //非对称加密算法,加解密用
            IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());
            //解密
            try
            {
              engine.Init(false, GetPublicKeyParameter(key));
              byte[] ResultData = engine.ProcessBlock(byteData, 0, byteData.Length);
              return ResultData;
            }
            catch (Exception ex)
            {
              return null;
            }
          }

          

  • 相关阅读:
    SQLSERVER 中GO的作用
    工作相关工具介绍
    SQL Server 没有足够的内存继续执行程序 (mscorlib)的解决办法
    glyphicons-halflings-regular.woff2 not found 前台错误修正
    Asp.net MVC Pager分页实现
    金融相关网站
    Excel 函数使用
    C# 使用 Invoke 实现函数的白盒 UT 测试
    反编译工具
    SQL Server 数据库修改后不允许保存
  • 原文地址:https://www.cnblogs.com/zwbsoft/p/16619612.html
Copyright © 2020-2023  润新知