数字签名
又称公钥数字签名、电子签章,是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是非对称密钥加密技术与数字摘要技术的应用。
对称加密
加密是一种“把数据搞乱掉”的技术。加密技术涉及到4种东西:
- 明文:可以被人或程序识别的数据。例如一个文本文件、一段歌词、一个Word文档、一首MP3、一个图片文件、一段视频等等。
- 加密算法:将数据搞乱掉的方法。
- 密钥(密码):一个你在进行加密操作时给出的字符串,让加密算法不但把明文“搞乱掉”,而且要乱得“与众不同”。这样即使别人搞到了解密算法,如果没有当初加密时所使用的密码,一样无法进行解密操作。
- 密文:明文被加密算法和密钥加密后的结果。它看上去就是一堆乱码,没有人或程序能知道它到底表示什么信息。
- 对称加密实例——景氏替换加密算法
明文:good good study, day day up.
密钥:google
景氏替换加密算法:将明文中的所有的字母“d”替换成密钥。
密 文:将“good good study, day day up.”中的所有字母“d”替换成“google”,就得到密文“googoogle googoogle stugoogley, googleay googleay up.”。这个密文乱得还可以吧?一般人看了肯定不知道它是什么意思。
那么什么是解密呢?解密就是把密文再变回明文的过程。
例如“景氏替换解密算法”就是:将密文中所有与密钥相同的字符串替换成“d”。
密文:googoogle googoogle stugoogley, googleay googleay up.
密钥:google
景氏替换解密算法:将密文中所有与密钥相同的字符串替换成“d”。
明文:将“googoogle googoogle stugoogley, googleay googleay up.”中的所有“google”替换成“d”,就得到了明文“good good study, day day up.”。
您肯定已经注意到了,我们在进行加密和解密时使用的密钥必须是相同的,例如在上例中,加密和解密都必须使用相同的密钥“google”。所以像“景氏替换加密算法”这种就被称为对称加密算法。目前最为流行的对称加密算法是DES和AES,此外,对称加密算法还有IDEA、FEAL、LOKI、Lucifer、RC2、RC4、RC5、Blow fish、GOST、CAST、SAFER、SEAL等。WinRAR的文件加密功能就是使用的AES加密算法。
非对称加密
非对称加密算法是一类与众不同的加密算法,它的密钥不是1个,而是2个(一对),我们先姑且称它们为密钥K1和密钥K2。非对称加密算法的特点是,如果用密 钥K1进行加密,则有且仅有密钥K2能进行解密;反之,如果使用密钥K2进行了加密,则有且仅有密钥K1能进行解密。注意“有且仅有”的意思——如果用密 钥K1进行了加密,是不能用密钥K1进行解密的;同样,如果用密钥K2进行了加密,也无法用密钥K2进行解密。
Web接口签名
- 针对每一个第三方应用程序Application,定义一个唯一标识appkey:luna; 其中appKey用来标识应用的身份,但还需要一种机制,确认这个请求的确是由该应用发出的,这个机制就是在上述Url中再添加一个“sign”参数,只有知道该应用的secretkey,才能生成正确的sign参数(也叫签名);
- 想以URL:http://www.luna.com/customer/queryUserInfo查询Application应用程序中的客户信息;
- 根据appkey获取secretkey,http://www.luna.com/safe/sign/getSecretkey/luna(说明:红色部分为appkey,采用路径参数的方式进行传递,当前环境appkey为:luna),得到:(secretkey, 25f9e794323b453885f5),将参数及参数值连用下划线接起来,形成参数字符串得到:appkey=123456789_secretkey=25f9e794323b453885f5,获取secretkey的接口含有动态盐值,故保证secretkey的可靠性;
- 将上一步中应用资源路径与上一步生成的字符串用下划线拼接起来得到: http://www.luna.com/customer/queryUserInfo_appkey=luna_secretkey=25f9e794323b453885f5;
- 对第四步中生成的字符串进行Md5加密,输出即为该请求Url的sign:f5266d0469178ddc82,(此签名是根据上述资源应用路径、appkey及secretkey计算得出的真实签名,第三方实现签名算法时,可据此验证算法实现是否正确)。
Md5加密方法:
public static final String md5(String s) {
char[] hexDigits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
MessageDigest mdInst = null;
String result = null;
try {
byte[] inputBytes = s.getBytes("UTF-8");
mdInst = MessageDigest.getInstance("md5");
mdInst.update(inputBytes);
byte[] md = mdInst.digest();
int j = md.length;
char[] str = new char[j * 2];
int k = 0;
for (int i = 0; i < j; ++i) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 15];
str[k++] = hexDigits[byte0 & 15];
}
result = new String(str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}