客户端&服务端加密方案

首先,服务器跟客户端的数据加密方式,采用了非对称加密,也就是私钥和公钥进行配对。公钥进行加密,私钥进行解密,或者私钥进行加密,公钥进行解密。

对称加密加密解密用同一个秘钥,安全性相对于非对称加密来说低一些。
对称加密用私钥公钥一对秘钥进行加解密,而且秘钥是随机且加密的,安全性相对高一些;
对称加密在效率上比非对称加密要高一些。

一,服务器端生成一对秘钥,公钥和私钥,然后给客户端一份公钥,保存在本地。服务器端保留一份私钥;
二,客户端要传输数据,将数据用公钥进行加密,进行传输,服务端收到数据后用私钥进行解密;
三,服务端要发送数据,将数据用私钥进行加密,发送后,客户端收到数据后用公钥进行解密。
为了更安全起见,客户端在传输时,可以先将数据进行AES加密,然后再通过公钥进行RSA加密进行上传。只不过服务器端收到数据后,先通过私钥进行RSA解密,然后再将数据进行AES解密,得到明文数据。
以上方案,服务端可以先将数据进行AES加密,然后通过私钥进行RSA加密进行传输。客户端收到消息后,先通过公钥进行RSA解密,再将解密的数据进行AES解密,得到明文数据。

iOS终端生成私钥公钥命令:

openssl genrsa -out rsa_private_key.pem 1024
//公钥是通过私钥进行生成的
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

模拟公钥私钥加解密过程,用了RSA类库:

    //data = [RSA stripPrivateKeyHeader:data];
    //公钥
    NSString *publicFePath = [[NSBundle mainBundle] pathForResource:@"rsa_public_key" ofType:@"pem"];
    NSString *publicStr = [[NSString alloc] initWithContentsOfFile:publicFePath encoding:(NSUTF8StringEncoding) error:nil];
    //公钥加密
    NSString *encrypted = [RSA encryptString:@"你的名字叫什么!" publicKey:publicStr];
    NSLog(@"encrypted: %@", encrypted);
    //
    //私钥
    NSString *privateFePath = [[NSBundle mainBundle] pathForResource:@"rsa_private_key"ofType:@"pem"];
    NSString *privateStr = [[NSString alloc] initWithContentsOfFile:privateFePath encoding:(NSUTF8StringEncoding) error:nil];
    //私钥解密
    NSString *decrypted = [RSA decryptString:encrypted privateKey:privateStr];
    NSLog(@"decrypted: %@", decrypted);

附上一张盗用的网图,链接忘记了,着实抱歉。

Leave a Reply

Required fields are marked *