.net 签名加密实现的一种简单方法

加密方法有很多,以下是其中一种简单的签名模式

1、首先客户端通过webapi按照IP地址,时间戳,随机数生成签名,并传递序列号

private Result_Sign Valid()
        {
            string ServerIP = "192.168.1.6";// HttpContext.Request.ServerVariables.Get("Local_Addr").ToString(); //地址
            string timestamp = DateTimeToStamp(DateTime.Now); //时间戳

string nonce = ST.WEB.App_Start.Common.CreateValidateCode(6);//随机数
            string SignStr = SignatureString(ServerIP, timestamp, nonce);//生成签名
            string appseq = ConfigurationManager.AppSettings["DPSeq"]; //产品序列号
            string Url = string.Format("http://www.abc.com:89/api/Valid?signature={0}&timestamp={1}&nonce={2}&appseq={3}", SignStr, timestamp, nonce, appseq);//POST发送URL
           
            string resStr = ST.WEB.App_Start.Common.Get_Http(Url, 12000);
            Result_Sign resJson = new Result_Sign()
                {
                    code = "-1",
                    message = ""
                };
            if (resStr.Substring(0, 2) != "错误")
            {
                resJson = JsonConvert.DeserializeObject<Result_Sign>(resStr);
            }
            return resJson;
 }

// DateTime时间格式转换为Unix时间戳格式
 private string DateTimeToStamp(DateTime time)
 {
      System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
       return ((int)(time - startTime).TotalSeconds).ToString();
 }

//生成签名串

private string SignatureString(string appIP, string timestamp, string nonce)
 {
            string[] ArrTmp = { appIP, timestamp, nonce };

Array.Sort(ArrTmp);
            string tmpStr = string.Join("", ArrTmp);

tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
            return tmpStr.ToLower();
 }

//生成随机数

public static string CreateValidateCode(int length)
{
            int[] randMembers = new int[length];
            int[] validateNums = new int[length];
            string validateNumberStr = "";
            //生成起始序列值
            int seekSeek = unchecked((int)DateTime.Now.Ticks);
            Random seekRand = new Random(seekSeek);
            int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000);
            int[] seeks = new int[length];
            for (int i = 0; i < length; i++)
            {
                beginSeek += 10000;
                seeks[i] = beginSeek;
            }
            //生成随机数字
            for (int i = 0; i < length; i++)
            {
                Random rand = new Random(seeks[i]);
                int pownum = 1 * (int)Math.Pow(10, length);
                randMembers[i] = rand.Next(pownum, Int32.MaxValue);
            }
            //抽取随机数字
            for (int i = 0; i < length; i++)
            {
                string numStr = randMembers[i].ToString();
                int numLength = numStr.Length;
                Random rand = new Random();
                int numPosition = rand.Next(0, numLength - 1);
                validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));
            }
            for (int i = 0; i < length; i++)
            {
                validateNumberStr += validateNums[i].ToString();
            }
            return validateNumberStr;
 }

/// <summary>
        /// 获取远程服务器ATN结果
        /// </summary>
        /// <param name="strUrl">指定URL路径地址</param>
        /// <param name="timeout">超时时间设置</param>
        /// <returns>服务器ATN结果</returns>
        public static string Get_Http(string strUrl, int timeout)
        {
            string strResult;
            try
            {
                HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(strUrl);
                myReq.Timeout = timeout;
                HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
                Stream myStream = HttpWResp.GetResponseStream();
                StreamReader sr = new StreamReader(myStream, Encoding.Default);
                StringBuilder strBuilder = new StringBuilder();
                while (-1 != sr.Peek())
                {
                    strBuilder.Append(sr.ReadLine());
                }
                strResult = strBuilder.ToString();
            }
            catch (Exception exp)
            {
                strResult = "错误:" + exp.Message;
            }
            return strResult;
        }
2、服务器端获取数据并验证返回结果

[HttpGet]
 public Result_Sign Sign(string signature, string timestamp, string nonce, string appseq)
 {
            Result_Sign sign = new Result_Sign()
            {
                  code="0",
                  message="fault"
            };
            if (Tool.ValidateSignature(signature, timestamp, nonce, appseq))
            {
                sign.code = "1";
                sign.message = "success";
            }
            return sign;

}

/// <summary>
        /// 检查应用接入的数据完整性
        /// </summary>
        /// <param name="signature">加密签名内容</param>
        /// <param name="timestamp">时间戳</param>
        /// <param name="nonce">随机字符串</param>
        /// <param name="appseq">序列号</param>
        /// <returns></returns>
        public static  bool ValidateSignature(string signature, string timestamp, string nonce, string appseq)
        {
            bool result = false;
            Register item = Cache.GetBySeq(appseq);//获取序列号相关信息
            if (item != null)
            {
                if (DateTime.Parse(item.ExpireDT) < DateTime.Now.Date) //是否过期
                {
                    return result;
                }
                #region 校验签名参数的来源是否正确
                string[] ArrTmp = { item.IP, timestamp, nonce };
                Array.Sort(ArrTmp);
                string tmpStr = string.Join("", ArrTmp);
                tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
                tmpStr = tmpStr.ToLower();
                if (tmpStr == signature && isNumberic(timestamp))
                { //验证成功
                    DateTime dtTime =  StampToDateTime(timestamp);
                    double minutes = DateTime.Now.Subtract(dtTime).TotalMinutes;
                    if (minutes < 5) //时间不能大于5分钟
                    {
                        result = true;
                    }
                }
                #endregion
            }
            return result;
}

/// <summary>
 ///  时间戳转时间
 /// </summary>
/// <param name="timeStamp"></param>
/// <returns></returns>
 private static DateTime StampToDateTime(string timeStamp)
 {
            DateTime dateTimeStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
            long lTime = long.Parse(timeStamp + "0000000");
            TimeSpan toNow = new TimeSpan(lTime);
            return dateTimeStart.Add(toNow);
 }

/// <summary>
/// 是否为数字
 /// </summary>
 /// <param name="message"></param>
 /// <returns></returns>
 protected static bool isNumberic(string message)
 {
            System.Text.RegularExpressions.Regex rex =
            new System.Text.RegularExpressions.Regex(@"^\d+$");

if (rex.IsMatch(message))
            {

return true;
            }
            else
                return false;
 }

public class Result_Sign
{
        public string code { set; get; }
        public string message { set; get; }

}

时间: 2024-10-29 19:09:58

.net 签名加密实现的一种简单方法的相关文章

元素水平居中和垂直居中的几种简单方法

一.如何使元素在水平方向上居中 1. 使用text-align:center. 在父级元素的CSS样式设置text-align:center.把内部嵌套一个div把它当作文本来对待,不过这个方法有时候是不管用的. 2.在需要居中的元素设置margin:0 auto.     这句CSS的意思为:设置margin-left和margin-right为自动适应父级元素宽度.所以可以使元素水平居中,不过记得设置其width. 二.如何使元素在垂直方向上居中 1.使图片在垂直方向上居中. div{bac

WPF编程 ,TextBlock 显示百分数值的一种简单方法。

原文:WPF编程 ,TextBlock 显示百分数值的一种简单方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/86524376 此处是绑定了另一控件的值,也可用于数据绑定的情况,最后格式化一句是关键,? <TextBlock Text="{Binding Value,Mode=OneWay,ElementName=pro2,StringFormat={}{0:p2}}" /&

Qt实现软件自动更新的一种简单方法

前言 最近在学习Qt开发上位机,想实现一个检查更新的功能,网上搜索了一大圈,发现实现过程都很复杂,关键是代码看不懂,所以就自己开发一种简单的方式来实现.实现效果如下: 点击"检查更新"按钮,如果当前版本低于远程的版本,那么会弹出如下窗口,提示更新,并显示远程的的版本号,更新时间,更新说明,如下图所示: 如果点击"去下载",那么会调用系统默认浏览器,直接创建下载任务.点击"不更新",则取消更新. 如果当前版本号和远程一致,那么会提示"已经

Python库安装的三种简单方法

我使用的是python3.4 第一种: pip3 install 库名 pip install 库名 第二种:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应文件的whl,然后直接这样就可以了 第三种,到各种库官方地址下载源代码 转到文件对应目录,直接命令下 python setup.py install 关于三种安装方法,可能用cx-Freeze打包后,程序会缺库,建议把主要的源代码扔到Lib\site-packages下

[ActionScript 3.0] 处理xml内容换行时行间距较大问题的一种简单方法

我们一定遇到过这种情况,在读取xml里的文章内容时,一旦有换行的位置在flash里显示出来的行间距会比较大,而并非我们想要的效果,解决这个问题的方法除了使用正则表达式以外,这里介绍一种比较简单的方法,利用str.split("\r\n").join("\r")方法即可,如下示例: 1 package 2 { 3 import flash.display.Sprite; 4 import flash.text.TextField; 5 import flash.tex

下载文件的一种简单方法js

我在做的一个项目有一部分要下载附件,可是我们公司用了一个包和网上的用response的解决方法冲突,而网上的js解决方法又用到了ActiveXObj我们经理不让用这个.还好我一个同事很利害用了一个很简单的方法,简单到我都吃惊了. window.open(url) /  window.open(url,'_parent'); 这个url是相对路径.比如说你在你的页面work/upload/prea里存储了xx.txt文件 那么下载的这个路径就是url="upload/prea里存储了xx.txt

用strace排查故障的5种简单方法(每日一译)

原文链接:5 simple ways to troubleshoot using Strace 我很意外大部分人都不知道如何使用strace.strace一直是我的首选debug工具,因为它非常的有效,很多问题都能够用它进行排查. strace是什么? Strace是一个用来跟踪系统调用的简易工具.它最简单的用途就是跟踪一个程序整个生命周期里所有的系统调用,并把调用参数和返回值以文本的方式输出. 当然它还可以做更多的事情: strace可以过筛选出特定的系统调用. strace可以记录系统调用的

教你一种简单方法给word和PDF格式的文件使用电子签名

  前言  虽然还处在非常时期,但很多公司已陆陆续续复工或准备复工.   上周,人事妹纸给了我们一份,企业员工健康情况申报表.具体如下 现在问题来了,需要本人签名,电脑打上去的不算,需要手写. 此时,我家附近打印店还未开门,也不想出门,虽然可以手抄,可是懒啊! 于是就找到了下面这种相对简单粗暴的方法 使用类似美图秀秀这类软件的涂鸦签名功能(绝对没有打广告,只是偶然发现可以这样操作) 首先把要填写的文档手机截图,然后打开美图秀秀,找到图片美化选项 接着在手机相册中选取文档截图,在下面工具栏中,往右

iOS关闭键盘的两种简单方法

方法一: //1, 关闭键盘 [[[UIApplication sharedApplication] keyWindow] endEditing:YES]; 方法二: //2, 关闭键盘 [[self findFirstResponderBeneathView:self] resignFirstResponder]; - (UIView*)findFirstResponderBeneathView:(UIView*)view { // Search recursively for first r