[C#]简单离线注册码生成与验证
本文使用RSA非对称加密和Base64简单地实现离线注册码的生成与验证功能。
主要思路就是提供者持有密钥,通过RSA加密客户机标识或时间标识,再通过Base64加密成不太难看的注册码,然后分发给客户机。
客户机解Base64后,通过持有的公钥来验证注册码是否与本机标识或时间标识相符。
一、生成公密钥
RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();
File.WriteAllText("PrivateKey.xml", cryptor.ToXmlString(true));
File.WriteAllText("PublicKey.xml", cryptor.ToXmlString(false));
为了方便长期保存这里就直接存入文件了。
为了避免客户机公钥丢失,我比较倾向于将公钥直接编译到验证程序中,但是这样也就意味着如果更换了密钥,老的验证程序就验不了新生成的注册码了。
二、生成注册码
static string CreateRegCode(string mac, DateTime date)
{
RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();
cryptor.FromXmlString(File.ReadAllText("PrivateKey.xml"));
string signature = String.Format("[{0}][{1}]", mac, date.ToString("yyyy-MM-dd"));
byte[] regCodeBytes = cryptor.SignData(
Encoding.UTF8.GetBytes(signature),
"SHA1");
return Convert.ToBase64String(regCodeBytes);
}
这个方法是通过加密MAC和日期的组合来生成注册码,需要注意几点:
1.参数中的MAC是客户机的地址2.第四行的文件是上一步生成的密钥文件
3.由于只考虑验证,所以客户机还必须知道参数中的date
三、验证注册码
static bool Verify(string regCode)
{
const string PUBLIC_KEY = "";
try
{
RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();
cryptor.FromXmlString(PUBLIC_KEY);
byte[] signedData = Convert.FromBase64String(regCode); bool today = cryptor.VerifyData(
Encoding.UTF8.GetBytes(String.Format("[{0}][{0}]", DateTime.Now.ToString("yyyy-MM-dd"))),
"SHA1", signedData);
bool machineToday = cryptor.VerifyData(
Encoding.UTF8.GetBytes(String.Format("[{0}][{1}]", MAC, DateTime.Now.ToString("yyyy-MM-dd"))),
"SHA1", signedData);
bool forever = cryptor.VerifyData(
Encoding.UTF8.GetBytes(String.Format("[{0}][{1}]", MAC, Environment.MachineName)),
"SHA1", signedData);
return today || machineToday || forever;
}
catch
{
return false;
}
}
这个方法验证了三种类型的注册码:当天可用、本机当天可用和永久可用。需要注意:
1.第三行的公钥就是第一步的PublicKey.xml中的内容
2.十四和十七行的MAC是客户机的物理地址,至于怎么获取不是本文的重点,请各位看官自行百度
3.考虑到客户机填写的注册码有可能不是合法的Base64文本,需要捕获解析时异常
其实RSACryptoServiceProvider也提供了解密的方法,这样就可以验证更多种类的验证码了。
[C#]简单离线注册码生成与验证的更多相关文章
- js简单验证码的生成和验证
如何用js生成简单验证码,并验证是否正确的方法 1.html页面如下 <div> <table border="0" cellspacing="5&qu ...
- 我只知道一点非常简单的关于MVC的验证
我只知道一些非常简单的关于MVC的验证 如题,我只知道一点非常简单的关于MVC的验证,所以如果您接触过MVC的验证,相信也就不用看了,这个且当作是学习笔记吧. 先小讲解一下他基本的五个从Model里打 ...
- IntelliJ IDEA 14 注册码生成java代码(转)
https://confluence.jetbrains.com/display/IntelliJIDEA/Previous+IntelliJ+IDEA+Releases 分享几个license: ( ...
- Core文件简单介绍及生成设置方法
Core文件简单介绍及生成设置方法 Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试.当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文 ...
- Python 常用模块系列学习(1)--random模块常用function总结--简单应用--验证码生成
random模块--random是一个生成器 首先: import random #导入模块 print (help(random)) #打印random模块帮助信息 常用function ...
- java中生成和验证jwt
在这篇文章中主要记录一下在Java中如何使用 java 代码生成jwt token,主要是使用jjwt来生成和验证jwt,关于什么是JWT,以及JWT可以干什么不做详解. jwt的格式: base64 ...
- MiniWord .NET Word模板引擎,藉由Word模板和数据简单、快速生成文件。
Github / Gitee QQ群(1群) : 813100564 / QQ群(2群) : 579033769 介绍 MiniWord .NET Word模板引擎,藉由Word模板和数据简单.快速生 ...
- PHP 用session与gd库实现简单验证码生成与验证的类
验证码是为了防止机器灌水给网站带来污染以及增加服务器负担而出现的.目前大大小小的网站都有验证码.今天自己实现了一个简单的验证码类.说简单是因为没有加一些干扰的弧线等等,只是将文字旋转了一下.当然,因为 ...
- php 图片验证码生成 前后台验证
自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一下,希望大家在用到相关问题的时候可以有一定的参考性. 首先,php验证码生成. 代码如下: 1.生成图像代 ...
随机推荐
- UWP开发---嵌套DataTemplate&模板选择器
对于Json结构体items不完全一致的情况下,在UWP平台是如何处理数据,并通过不同的模板选择,进行显示呢? 一,嵌套Json分析 1,结构 通过抓取index的API(点击请求API)获取到的js ...
- STL在数组算法的使用
find(a:起始位置 , b: 终止位置 , c: 要查找的内容) ------>查找寻找内容的位置 count(a:起始位置 , b: 终止位置 , c: 要查找的内容) -- ...
- 《Python黑帽子:黑客与渗透测试编程之道》 网络基础
TCP客户端: 示例中socket对象有两个参数,AF_INET参数表明使用IPv4地址或主机名 SOCK_STREAM参数表示是一个TCP客户端.访问的URL是百度. #coding=utf-8 i ...
- jzoj5710
對於每個詢問,我們先考慮插入1~r中每個數的答案,這樣子就不用考慮後面數對現在的影響 那麼我們可以在權值線段樹的每一個位置存儲每一個值最後一次結束的位置 問題變成了,如何判斷區間連續? 我們可以對線段 ...
- Kafka Java 客户端开发
依赖包导入 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.1 ...
- php判断是否使用手机访问
直接上代码 /** * 检测是否使用手机访问 * @access public * @return bool */ public function isMobile() { if (isset($_S ...
- h5聊天室web端(仿微博、微信)|h5仿微信网页端|仿微信界面弹窗
这段时间一直在着手h5开发手机端聊天系统——html5仿微信聊天室,最近又在原先基础上开发了一个仿微信.微博网页web版聊天系统,使用到了HTML5+css3+jQuery+wcpop等技术开发,弹窗 ...
- Linux CentOS7系统中mysql8安装配置
mysql是世界上最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司所有.今天我将记录一下如何在Linux centos7系统上安装和配置MySQL. 目录 环境准 ...
- 数据库MySQL(课下作业,必做)
数据库MySQL(课下作业,必做) 题目要求: 下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB,导入 ...
- (转) Linux(Centos7)yum安装最新mysql
原文:http://blog.csdn.net/gebitan505/article/details/54613549 环境 CentOS 7.1 (64-bit system) MySQL 5.6. ...