首先,我们需要确保外部网络可以访问我们的本地服务
我们用的工具是Ngrok,有很多下载地址。可以网上搜索,下载不了的朋友可以私信我。
下载后,解压
这个地址可以使用,但是这个地址每次启动都会随机生成。想要长期不变,需要付费等手段,但目前满足映射外网的目的
我们在本地服务中编写一个简单的程序,看看它是否可以访问
我们首先需要做的是解决这两个角色之间的问题
我们先来看这一部分
认证的原则如下:
微信服务器向我们的服务器发送几个数据,A,B,C,d,我们可以用Token加上B,C,d重新计算A1,一旦我们比较A和我们计算的A1是否相同,我们就可以知道是微信服务器向我们发送数据。
微信服务器在认证我们的服务器时会传递四个参数
时间戳、签名、随机数、回声
因此,传来的数据是(例如):
我对这些参数的理解是:
Nonce是服务器生成的一个随机数,在客户端第一次请求页面时发送回客户端。客户端获取随机数,将其与用户密码连接,并执行不可逆加密(MD5、SHA1等)。),然后将加密后的字符串连同用户名、Nonce、加密算法名一起发送回服务器;服务器使用接收到的用户名在数据库中搜索密码,然后用与客户端相同的算法加密,然后与客户端提交的加密字符串进行比较。如果两个字符串一致,则表示用户身份有效。从而解决了用户密码明文被盗的问题,即使攻击者知道算法名和随机数,也无法解密密码。
每个随机数只能由一个用户使用一次,这可以防止攻击者使用重放攻击,因为Http消息无效。可选的实现是将每个请求的随机数保存到数据库中。当客户端再次提交请求时,它会将请求头中的随机数与数据库中的数据进行比较。如果随机数已经存在,则证明该请求可能是恶意的。但是,这个解决方案也有一个问题。很有可能两个正常的资源请求生成的随机数是一样的,导致正常的请求被认为是攻击。随着数据库中存储的随机数越来越多,这个问题就会变得很明显。因此,您需要添加另一个参数,时间戳
时间戳是根据服务器当前时间生成的字符串,与nonce放在一起,可以表示服务器在某个时间点生成的随机数。这样,即使生成的随机数相同,也因为生成的时间点不同而被认为是有效随机数。
问题又来了。随着用户访问的增加,数据库中存储的随机数/时间戳/用户名数据量将变得非常大。对于这个问题,可选的解决方案是为数据设置一个“到期时间”,例如,存储在数据库中超过一天的数据将被清除。如果是这种情况,攻击者可以等待一天,然后将截获的HTTP消息提交给服务器。此时,因为随机数/时间戳/用户名数据已经被服务器清除,请求将被视为有效。要解决这个问题,需要为时间戳设置一个超时时间,比如将时间戳与服务器当前时间进行比较,如果相差一天,则认为时间戳无效。
Echostr想了很久也没搞明白。它的作用很明显。就是认证我的服务器。可以原样返回,无需任何操作。所以我猜主要是用于企业等其他用途。
签名,这是我们之前提到的A
相关代码
1.《微信认证服务 微信认证图解教程》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《微信认证服务 微信认证图解教程》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/1241632.html