|
通常来说,非对称加密签名及验证的工作流程为:
1、业务服务器只需要实现使用私钥进行签名(RsaSign),然后将签名结果(timestamp、sigstr)反馈给客户端;
2、在客户端调用LoginEx接口进行登录;
3、AnyChat服务器收到登录请求后,会使用公钥进行签名信息验证(RsaVerify),确认登录者身份,反馈结果给客户端;
4、客户端将触发登录回调事件:OnAnyChatLoginResult(int errorcode),如果errorcode=0表示身份验证成功。
Java:
public static void main(String[] args) throws InterruptedException, IOException
{
String privatekey =
"-----BEGIN RSA PRIVATE KEY-----\n" +
"MIICWwIBAAKBgQDc/sgvXXKZrr8lX9pZgZMO9y8jRq/s3YYlJ/BayEvj9EIVhiXG\r"+
"A3rZwhh0+L4UdkPE5o/t6Bh1oY6nlGvkFuENgFwkRzrn2qP7wl3MgJD8WW6OM4JA\r"+
"1fd2Wwt/TUENQeoN30bluy4ZQPby+bGl3ic5JW0hXhEWHAjk7e0ruSxRbwIDAQAB\r"+
"AoGALbcSyCGHlFz+s4eJjpxsRFtDyANWXyRQHJ2PbegjMsuTZAp1A+oyXpt1HbVa\r"+
"9LamPDQJsAgkDylVbjsYun01Hoh0i+lV5rOwWpwZC1jo4ohS1MAVPaRofCD2BlCJ\r"+
"ML3i+qIznqJu7VpC2YjULTVphUf5guUetr+iP1lkNrKhRNkCQQDxwn7BO9qw5V53\r"+
"/5CG9z+PAPYR2Be+cD/cuGP8ooovkZ+tJ76UXSkwXwveDFf8civdkUB9v0P/EKyS\r"+
"UMp8u4hNAkEA6gMtlFA1+ju6pTjMnxa8cmgPYXinY70OxgpOfyz7Erp2Xmq+4J3Y\r"+
"AQeerY/aJ3K4itKgyyPXsi9cCPxv6UxeqwJAQHAS0PZfJ986+skHgLHOIxOigscS\r"+
"LRRGMVKEdAXuxxcNdF2vkmPyYo4y35ByszrLLldU1S9xtD6BgM4/6lch0QJASVEn\r"+
"laEv2C+ggaVzDqD798g8kWhQ4YHZQBj4kQXRwANllJ1TImKxy1jM0UoRqmxZ/zyQ\r"+
"njSjnrMR3crhcTG5MwJANPjy150Mf+J3SHz6s1aRddggzLOMzDtObUs60ZQRi6PS\r"+
"88K3sAbX5C1in9B0Dg5TOPanEEzsonYVIs1UZ6DqAg==\r"+
"\n-----END RSA PRIVATE KEY-----\n";
String publickey =
"-----BEGIN PUBLIC KEY-----\n"+
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDc/sgvXXKZrr8lX9pZgZMO9y8j\r"+
"Rq/s3YYlJ/BayEvj9EIVhiXGA3rZwhh0+L4UdkPE5o/t6Bh1oY6nlGvkFuENgFwk\r"+
"Rzrn2qP7wl3MgJD8WW6OM4JA1fd2Wwt/TUENQeoN30bluy4ZQPby+bGl3ic5JW0h\r"+
"XhEWHAjk7e0ruSxRbwIDAQAB\r"+
"\n-----END PUBLIC KEY-----\n";
AnyChatOutParam signResult = new AnyChatOutParam();
int userid = -1;
String appid = "CED78A73-134B-4403-9992-83B79702C4A0";
int errorcode = AnyChatSign.RsaSign(userid, appid, privatekey, signResult);
if(errorcode == 0)
{
int timestamp = signResult.GetIntValue();
String sigstr = signResult.GetStrValue();
System.out.print("rsa sign result, timestamp: " + timestamp + " sigstr: " + sigstr + "\r\n");
errorcode = AnyChatSign.RsaVerify(userid, appid, sigstr, timestamp, publickey);
System.out.print("rsa verify result, errorcode: " + errorcode + "\r\n");
}
}
输出:
rsa sign result, timestamp: 1452580453 sigstr: TBK5M9FPcDfZ8/bawWDoYW82J9yAw1Sa8GURKf4fgRrOhYGk/ODOHODNih4ox2F4gXPdq5UK1kRGbu114dNSK2ITLfhupQ5EMxIF9Xy1uR/z7mIWaViMGKMDLNd9b4p6r9b3vDBmh1OXV9oknaEELLQLiw6Ka3JIj/qTmKKPD6E=
rsa verify result, errorcode: 0
有关RSA加密算法:
互联网时代,密码和网络安全是通信的基础,无论是微信聊天,还是淘宝交易,都需要密码技术保障个人隐私和财产安全。
而现在的大部分加密,都由RSA算法完成,它基于一个非常简单的数论事实:
将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
例如在一套 RSA 算法下,给定一对解密密钥3和5,由用户自己保存,那么3和5的乘积15,就成为公开的加密密钥。
当把3和5变成1024位的素数A和B时,令C是A和B的乘积。那么验证A乘以B等于C,是一件计算起来比较简单的事,即用户自己的密码可以获得通过;但是要从C倒推回A和B,却是无比的艰难,其运算时间超出计算机的能力,所以密码很难被破解。
所以RSA可以在公开加密密钥、加密和解密算法的情况下,通过验证和求解在时间复杂度上的极端不对称性,建立电子加密的基础。
RSA 是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
今天,只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
|
|