#encryption
公钥加密私钥解密是密送,保证消息即使公开也只有私钥持有者能读懂。 私钥加密公钥解密是签名,保证消息来源是私钥持有者。 数字签名只能验证数据的完整性,数据本身是否加密不属于数字签名的控制范围。
参考 https://gist.github.com/leeyisoft/80b9bdaccd3b2f93c879530de10993fd
openssl genrsa -des3 -out test_rsa_private_key.pem
#去除掉密钥文件保护密码
openssl rsa -in test_rsa_private_key.pem -out test_rsa_private_key.pem
#分离出公钥
openssl rsa -in test_rsa_private_key.pem -pubout -out test_rsa_public_key.pem
#生成一个没有加密的ca私钥
openssl genrsa -out rsa_pri_key.pem 1024
openssl rsa -in rsa_pri_key.pem -pubout -out rsa_pub_key.pem
openssl pkcs8 -topk8 -inform PEM -in rsa_pri_key.pem -outform PEM -nocrypt > rsa_pri_key_pkcs8.pem
如果签名报以下错误:
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
则说明rsa私钥的格式不是pksc8格式,需要使用以下命令转换一下:
openssl pkcs8 -topk8 -inform PEM -in rsa_pri_key.pem -outform PEM -nocrypt > rsa_pri_key_pkcs8.pem
CS,C客户端,S服务器端 在客户端软件发布前,客户端保存一个公钥,服务器保存一个私钥;客服端and服务器都保存一个固态key : solid_key 步骤1:客户端随机生成一个对称密钥,称为动态key : dynamic_key,使用公钥加密内容(dynamic_key+账户+密码+其他需要的参数)。发送给服务器
步骤2:服务器收到后使用私钥解密,并验证用户和密码是否正确,正确的话保存此dynamic_key在用户的信息中(如果原先已经有了dynamic_key就替换掉旧的),返回数据:包括客户端登录成功的信息,返回一个Token(令牌,以后见牌如见人)和其他需要返回的参数(传输过程中不携带uid,用token标识用户唯一身份,更安全)。
步骤3:使用本地保存的dynamic_key解密得到Token和其他参数。 安全传输准备工作做完了。
步骤4:每次传输数据对于加密的内容一律使用dynamic_key进行加密,按照协商好的签名规则进行签名signature(需要dynamic_key参与到签名规则中,以保障安全),并附以明文参数token、明文参数signature、密文参数params这三部分,然后把此内容发送给服务器。
步骤5:根据token找到保存的dynamic_key,然后进行解密(dynamic_key仅仅用来解密,对于解密的内容无法验证),然后根据签名规则验证签名;查看token是否匹配,如果匹配的话那么此次请求就是有效的,否则无效,需要重新登录;如果验证签名失败,直接返回错误。
更新公钥通知服务 服务器端首先需要用原来的私钥签名,客服端有原来的公钥验证签名,如果签名通过,客服端方可更新公钥;签名不通过,需要重新下载最新客户端安装包(包含新的公钥);
如果被网络接触,还需要知道固态key,才能够修改公钥
下表解决“根据token获取对应用户uid”在redis中如果做持久存储的话,token失效无法被有效清除,导致占用内存的风险;
CREATE TABLE `lee_user_token` (
`uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户UID',
`token` char(36) NOT NULL COMMENT 'uuid 生产的36位字符串',
PRIMARY KEY (`uid`),
UNIQUE KEY `i_token` (`token`,`uid`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='这里只是存储 token 与 uid 的映射关系,不做登录过期有效性判断';
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。