一、硬件设备授权
即用户在硬件设备输入一个序列号(或一个包含授权信息的文件),然后硬件设备便可正常使用. 
 
二、授权方案

构思授权方案时,参考了下面网址的思路:

  • 1.用户提供自己的硬件ID,从设备厂家得到一串授权序列号,在设备中输入序列号,设备即可激活使用.
序列号形如 :
1330-1440-1602-3671-9749-7897
XDM3T-W3T3V-MGJWK-8BFVD-GVPKY
技术实现:
授权序列号,是经过私钥加密的授权信息的字符串,设备中使用公钥解密,得到正确授权信息,则设备被激活.RSA非对称加密算法
限制:授权信息需要尽量短,因为rsa加密算法库(openssl)可加密长度有限制(与私钥长度有关,未具体了解),所以要用尽量少的数据保存尽量长的授权信息.
 
  • 2.用户提供自己的硬件ID,从设备厂家得到一个授权文件,在设备中上传授权文件,设备即可激活使用
授权文件中的内容形如:
{
 "ver": 1,
 "info": {
  "productid": "vW2TNOMlLvZdAgAF",
  "invaliddate": "2014-05-16 11:40:30",
  "userlimit": 100
 },
 "signature": [25, 218, 203, 190, 99, 76, 192, 136, 176, 181, 198, 128, 14, 250, 189, 198, 152, 208, 15, 202, 233, 77, 189, 3, 44, 113, 65, 231, 51, 100, 208, 127, 19, 255, 139, 174, 62, 9, 76, 165, 137, 15, 165, 178, 138, 9, 32, 218, 209, 222, 6, 234, 94, 5, 41, 130, 27, 232, 37, 195, 52, 120, 81, 143, 103, 40, 90, 93, 240, 115, 5, 117, 230, 65, 243, 182, 141, 64, 179, 140, 137, 155, 219, 75, 87, 83, 36, 49, 178, 210, 53, 171, 254, 28, 88, 39, 241, 57, 68, 204, 46, 231, 180, 133, 134, 108, 114, 243, 163, 30, 201, 103, 138, 15, 23, 247, 54, 32, 64, 181, 71, 12, 14, 88, 247, 156, 138, 32]
}
技术实现:
授权文件包含明文的"授权信息"以及使用私钥进行的"授权信息的签名"组成的字符串.设备使用公钥进行签名的验证.
(相对于序列号的几十个字符串来说,这里的字符串肯定会超过几百个,所以保存在文件中方便用户输入设备).
 
  • 3.用户提供自己的硬件ID,设备厂家更新"授权服务器"中指定硬件的授权信息,设备会自动激活
技术实现:
需要有一台公网服务器,处理查询授权信息的请求.
用户不需要输入任何序列号,只需要点击一个"更新"按钮,设备主动发送自身的硬件唯一ID,向某一服务器请求授权信息(得到第2种方案中的授权文件),成功获取到后,设备会自动激活.
 
三、结论
第1个方案需要严格定义授权信息,以便加密后的序列号长度尽量短,个人觉得实现起来不方便.
第3个方案需要额外设备一台服务器,增加了工作量,而且超出现有需求,此功能主要目的只是为了限制指定设备的时间,所以只需要每个硬件设备单独的序列号激活即可.
第2个方案能实现同第1个方案相同的效果,而且在以后改为在线激活时,可以轻松扩展.(基本原有功能可以不变,只需要增加一个公网服务器;增加一个自动从公网服务器获取授权文件的动作即可)
所以我选择了第2个方案,
那么,此时可以确定的是,我需要完成三个程序的编码.
1)新增 一个生成授权文件的程序,叫做gen

2)新增 一个验证授权文件是否合法的程序,叫做verify

 
 
3)修改 现有系统内的程序,  验证授权文件的合法性 ->提取授权文件中的"授权信息" -> 检验当前设备中的相应信息,根据情况设置相应的限制
 
 
四、编码实现
 
Hash值
使用md5或者sh1等摘要算法得到的数据指纹。
 
授权信息

生成的序列号(或授权文件)中所包括的信息,这些信息指定了硬件设备可用的功能。比如授权到期时间、限制可用人数、限制硬件ID等等。

 
RSA非对称加密算法
非对称加密技术有两个密钥,“公开密钥”和“私有密钥”。使用“公开密钥”加密,则可用“私有密钥”解密;使用“私有密钥”加密,则可用“公开密钥”解密。RSA算法中非对称加密技术的一种。具体原理可参考 RSA算法原理(一)
使用openssl中的rsa加密算法,对加密的数据长度有限制,所以一般只用于加密较短的Hash值。具体原因,查看API说明
私有密钥  --  公开密钥  可互相推导?
 
加密算法库

网上搜索加密算法库有很多,我本次使用的是openssl。


签名

使用私钥对“数据”的Hash值加密生成一个“签名值”,将“数据”和“签名值”一起发送出去。接收方使用公钥解密“签名值”得到一个Hash值h1,再对原始数据通过计算Hash值H2,对比H1和H2数据相同,则能保证此条信息是私钥拥有者发布的。其实和人类在合同上“签名”、“盖章”的方法一样,只是为了校验信息发布者的真伪。

 
 
生成RSA算法公钥和私钥的方法:
生成2048位的私钥文件,private.pem
openssl genrsa -out private.pem 2048
生成对应的公钥文件,public.pem
openssl rsa -in private.pem -pubout -out public.pem
从文件中读取密钥:
int readpub_rsakey(const char *filename, RSA **prsa)
{
  FILE *fp = fopen(filename, "r");
  if (NULL == fp) {
    printf("fopen() fail!\n");
    return -1;
  }
  *prsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL);
  if (NULL == *prsa) {
    printf("read_rsa_pubkey() fail!\n");
    fclose(fp);
    return -1;
  }
  fclose(fp);
  return 0;
}
int readpri_rsakey(const char *filename, RSA **prsa)
{
  FILE *fp = fopen(filename, "r");
  if (NULL == fp) {
    printf("fopen fail!\n");
    return -1;
  }
  *prsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
  if (NULL == *prsa) {
    printf("read_rsa_prikey() fail!\n");
    fclose(fp);
    return -1;
  }
  fclose(fp);
  return 0;
}
从字符串中读取密钥:
int getpub_rsakey(const char *key, RSA **prsa)
{
  BIO *bio = NULL;
  if (NULL == (bio = BIO_new_mem_buf((void*)key, -1))) {
    printf("BIO_new_membuf() fail!\n");
    return -1;
  }
  *prsa = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL);
  if (!(*prsa)) {
    printf("PEM_readbio_RSA_PUBKEY() fali!\n");
    BIO_free_all(bio);
    return -1;
  }
  return 0;
}
int getpri_rsakey(const char *key, RSA **prsa)
{
  BIO *bio = NULL;
  if (NULL == (bio = BIO_new_mem_buf((void*)key, -1))) {
    printf("BIO_new_membuf() fail!\n");
    return -1;
  }
  *prsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);
  if (!(*prsa)) {
    printf("PEM_read_bio_RSAPrivateKey() fail!\n");
    BIO_free_all(bio);
    return -1;
  }
  return 0;
}
五、参考
网上开源 RSA公钥加密算法 实现库
openssl 强大的工具集合
crypto++ 过于复杂的封装,特别是rsa实现模块。
速度上有优势的:XySSL, CyaSSL(都使用的LibTomMath)
逻辑上有优势的:axcrypto, raknet
还有一些大数库: vlong,WinNTL
对于公钥签名认证, google android自带的libmincrypt有超快的实现方法,可惜代码只是为了一家优化,仅提供e=3的加速。而网上通常的ASN.1证书,都用了e=63357。
 
int RSA_public_encrypt(int flen, const unsigned char *from,
  unsigned char *to, RSA *rsa,int padding);
 
openssl接口使用方法:
《精通pki网络安全认证技术与编程实现》
 
证书格式说明:(带有私钥的证书 、二进制编码的证书 、Base64编码的证书 )
 
密钥编码格式:(DER、PEM、NET )
 
加密、解密、签名等概念:

使用RSA非对称密钥算法实现硬件设备授权的更多相关文章

  1. Java中RSA非对称密钥加解密使用示例

    一.简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.这个算法经受住了多年深入的密码分析,虽然密码分 ...

  2. RSA非对称算法实现HTTP密码加密传输

    目前一般帐号系统,都是https来传输账户性息,申请一个https证书也不贵.但是网站的其它功能并不需要走https协议,https和http混布比较麻烦,所以决定先实现一个http协议传输RSA非对 ...

  3. JAVA RSA非对称加密详解[转载]

    一.概述1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现2.java6支持RSA算法3.RSA算法可以用于数据加密和数字签名4.RSA算法相对于DES/AES等对称加密算 ...

  4. 写给开发人员的实用密码学(七)—— 非对称密钥加密算法 RSA/ECC

    本文部分内容翻译自 Practical-Cryptography-for-Developers-Book,笔者补充了密码学历史以及 openssl 命令示例,并重写了 RSA/ECC 算法原理.代码示 ...

  5. RSA非对称算法(转)

    RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解.我们经 ...

  6. rssh RSA(非对称密钥)

    rssh ,非对称密钥,分为密钥和公钥 ,密钥在对面机器,需要进入的文件中,公钥是放在本地机器上 import paramiko private_key = paramiko.RSAKey.from_ ...

  7. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  8. SSH加密原理、RSA非对称加密算法学习与理解

    首先声明一下,这里所说的SSH,并不是Java传统的三大框架,而是一种建立在应用层和传输层基础上的安全外壳协议,熟悉Linux的朋友经常使 用到一 个SSH Secure Shell Cilent的工 ...

  9. ssh rsa 非对称加密 基本原理

    我们常用的ssh 免密登陆是用了 非对称加密的rsa算法(最为常用),与对称加密的相比会慢一些,但是更安全.秘钥长度超过768位无法破解. 默认长度是2048位(无法破解,非常安全) ssh-keyg ...

随机推荐

  1. 《Linux内核设计与实现》读书笔记(十)- 内核同步方法【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/01/3052865.html 内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我 ...

  2. How to install cacti With Nginx

    转载于:https://github.com/blackyboy/Ubuntu-Linux-Stuffs/blob/master/How-to-install-Cacti-Monitoring-Ser ...

  3. 单元测试之道(使用NUnit)

    首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上 ...

  4. [CF189A]Cut Ribbon(完全背包,DP)

    题目链接:http://codeforces.com/problemset/problem/189/A 题意:给你长为n的绳子,每次只允许切a,b,c三种长度的段,问最多能切多少段.注意每一段都得是a ...

  5. 台湾P2P平台

    2014年6月28日下午1:30,“2014两岸三地P2P网贷行业高峰论坛”在上海会展中心友谊会堂如期举行,现场高朋满座,来自全国各地的众多知名P2P网站平台的负责人参与了讨论,并就当前P2P行业的一 ...

  6. Redis Cluster架构和设计机制简单介绍

    之前另一篇文章也介绍了 Redis Cluster (link,在文章的后半部分) 今天看到这一篇,简单说一下(http://hot66hot.iteye.com/blog/2050676) 作者的目 ...

  7. R语言处理大规模数据集的编程要点

    1.提高程序效率,保证执行速度 (1)尽量使用向量化运算 (2)尽量使用矩阵,必要时才使用数据框 (3)使用read.table时,尽量显式设定colClasses和nrows,设定comment.c ...

  8. Codeforces 505 A Mr. Kitayuta's Gift【暴力】

    题意:给出一个字符串,可以向该字符串的任意位置插入一个字母使其变成回文串 因为字符串的长度小于10,枚举插入的字母,和要插入的位置,再判断是否已经满足回文串 #include<iostream& ...

  9. VC++的菜单控制和自绘菜单

    菜单控制为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值), ...

  10. PDO防注入原理分析以及使用PDO的注意事项 (转)

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下两个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...