如何使用 Nonces 保护 Web 请求
问题
用户找到了一种利用网站评分系统的请求验证系统的方法:复制高价值的 HTTP 请求。这会损害系统的完整性和可靠性。
解决方案:实现 Nonce 系统
Nonce(使用一次的数字)是通过确保特定请求不被执行来防止请求重放攻击的值。之前做的。这是实现随机数系统的常见且安全的方法:
服务器端随机数生成和验证
getNonce()函数
- 识别发出请求的客户端(例如,通过用户名、会话)。
- 使用安全哈希生成随机数函数(例如 SHA512)。
- 将随机数存储在与客户端 ID 关联的数据库中。
- 将随机数返回给客户端。
verifyNonce() 函数
- 为客户端获取之前存储的nonce ID.
- 从数据库中删除随机数(以防止其被重复使用)。
- 使用客户端提供的随机数 (cnonce)、请求数据和秘密盐生成哈希.
- 将生成的哈希值与客户端提供的哈希值进行比较。
- 如果哈希值匹配,则返回 true,表示有效nonce.
客户端 Nonce 用法
sendData() 函数
- 使用 getNonce 从服务器检索 nonce () 函数。
- 使用安全哈希生成客户端特定的随机数 (cnonce)函数。
- 连接服务器随机数、客户端随机数和请求数据。
- 根据连接值生成哈希。
- 将请求发送到服务器,包括数据、 cnonce 和 hash。
安全注意事项
- 随机随机数生成: makeRandomString() 函数应生成高度不可预测的随机数以增强安全性。
- 安全哈希函数: 利用强大的哈希函数(如 SHA512 或 bcrypt)进行与随机数相关的哈希计算。
- 每个请求单次使用: Nonce 只能使用一次并从存储中删除以防止重放攻击。