postgresql数据库实现了password、md5、scram-sha-256等等认证方式,考虑增加USBKEY等方式的进一步认证识别,设想在函数ClientAuthentication中常规认证函数之后增加一步USBKEY或其他方式的认证。
设想认证流程如下:
第一步常规认证结束(如md5)之后,增加一步公钥认证请求,其流程与MD5认证一致,首先服务端发送认证请求和随机数,客户端对随机数使用私钥签名后发送给服务端,服务端收到签名后使用预存的该用户的公钥对签名值进行验证,验证成功则认证通过。
验证:
增加宏AUTH_REQ_PUBLEIKEY用于在认证过程中进行处理公钥认证。
仿函数CheckMD5Auth,增加函数CheckPublicAuth,用于发送认证请求AUTH_REQ_PUBLEIKEY:
sendAuthRequest(port, AUTH_REQ_MD5, md5Salt, 4);//随机数长度可任意指定
在函数ClientAuthentication最后的钩子ClientAuthentication_hook位置部分调用上述函数CheckPublicAuth
至此,后端部分已处理完毕,下面是前端对认证CheckPublicAuth的处理:
在函数pg_fe_sendauth中增加对宏AUTH_REQ_PUBLEIKEY的处理,可以仿照对MD5的处理,首先接收随机数,然后对随机数进行处理(签名),然后发送签名值。
按照上述想法修改代码验证认证流程可行。