公司搬东莞了没办法年底还要找工作,这周周一面试周二入职,入职第一天,就让对接前海征信的接口,本周上线,压力山大。
而且那边提供的是demo都是java和php版,证书也是.jks格式,瞬间蒙蔽。
经过这几天研究,装了jdk通过工具把jks证书转成.net可识别的pfx格式,各种加密解密,签名认证,每天从8:30到晚上8:30,终于联调成功。
现在总结一下关于安全性方面的知识,参考资料是《C#高级编程(第10版)》。
安全性有几个方面需要考虑。一是程序的用户,访问应用程序的是一个真正的用户,还是伪装成用户的某个人?如何确定这个用户是可以信任的?确保程序安全的用户方面是两阶段过程:
1.用户首先要进行身份验证
2.进行授权。
本文主要讨论授权方面的知识。
加密数据
加密数据分为对称密钥和不对称密钥。对称密钥使用公钥/私钥来进行加密和解密。
如果使用一个公钥进行加密,就应该使用对应的私钥进行解密,而不是使用公钥解密;同样如果使用私钥加密,就应该使用对应的公钥解密。不可能从私钥中计算出公钥,也不可能从公钥中计算出私钥。
公钥可以由任何人使用,私钥必须安全的加锁。举个例子:
如果马云给李彦宏发了一封邮件,并且马云希望除了李彦宏外,其他人都不能查看该邮件,所以马云使用了李彦宏的公钥。
邮件是使用李彦宏的公钥加密,李彦宏打开该邮件并使用秘密存储的私钥解密。这种方式可以确保除李彦宏外,其他人都不能阅读马云的邮件。
这里有个问题:李彦宏不能确保邮件是马云发送的。马化腾可以使用 李彦宏的公钥 加密 发送给李彦宏的邮件 并 假装是马云。
我们使用公钥/私钥把这条规则扩展一下。再次从马云给李彦宏发送邮件开始。
在马云使用李彦宏的公钥加密邮件之前,马云添加了自己的签名,再使用自己的私钥加密该签名。然后使用李彦宏的公钥加密邮件。
这样就保证了除李彦宏外,其他人都不能阅读该邮件。在李彦宏解密邮件时,他检测到一个加密的签名。这个签名可以使用马云的公钥来解密。
而李彦宏可以访问马云的公钥,因为这个密钥是公钥。在揭秘了签名后,李彦宏就可以确定是马云发送的邮件。
对称密钥的加解密比非对称密钥的算法快很多。在网络通信中,一种方式是先使用非对称密钥进行密钥互换,再使用对称密钥加密网络发送的数据。
散列 |
MD5 SHA RIPEMD |
散列算法的目标是从任意长度的二进制字符串中 创建一个长度固定的散列值。这些算法那和数字签名一起用于保证数据的完整性。如果再次散列相同的二进制字符串,会返回想用的散列结果。 MD5由RSA实验室开发,比SHA1快。MD5使用128位的散列长度。 SHA1在抵御暴力攻击方面比较强大,SHA算法由美国国家安全局(NSA)设计。SHA使用160位的散列长度。 RIPEMD使用160位的散列长度。 |
对称 |
DES AES Rijandel |
对称密钥算法使用相同的密钥进行数据的加密和解密。现在认为DES是不安全的,因为它只使用56位的密钥长度,可以在24小时内被破解。 AES的密钥长度是128、192或256位。是美国政府采用的加密标准。 Rijandel非常类似于AES。 |
非对称 |
DSA ECD RSA |
非对称算法使用不同的密钥进行加密和解密。 RSA是第一个用于签名和加密的算法。广泛用于电子商务协议。 DSA使用基于椭圆曲线组的算法。密钥长度为1024位。 |
创建和验证签名
下面例子说明如何使用ECDSA算法进行签名。马云创建了一个签名,用马云的私钥加密,可以使用马云的公钥访问。因此保证该签名来自于马云。
李彦宏