web-services - 针对多个请求的高效密码散列

标签 web-services security google-app-engine rest

我在 AppEngine 上运行 REST 服务(可能不相关)。每个 REST 请求都附带一个用户 ID 和密码,在每个请求开始时,我都会对密码进行哈希处理,以查看它是否与我的记录匹配,然后再继续。

这在理论上运作良好,但在实践中我收到了来自用户的突发请求 - 每秒 4 或 5 个。 BCrypt 需要 500 毫秒来哈希每个请求的密码!真是浪费!

显然,我不想优化 BCrypt 时间。是否有缓存哈希的标准做法? memcache 是否是存储最近哈希密码及其哈希表的安全位置?我想那时我不妨将用户的纯文本密码存储在 Memcache 中。我喜欢执行 3 毫秒的内存缓存查找,而不是 500 毫秒的哈希,但安全性至关重要。实现某种 session 抽象会更有意义吗?

感谢您的建议!

编辑额外上下文:这是一个成绩簿应用程序,用于存储敏感的学生数据(成绩)。教师和学生从任何地方登录,包括通过 wifi 等。每个成功的请求都通过 https 发送。

最佳答案

REST API 的通常经验法则是让它们保持完全无状态,但是,与 goto 一样,时间和地点取决于您的要求。如果您不反对让客户端存储一个临时 session key (您只需要偶尔重新生成),那么您可以尝试一下。

当客户端发出请求时,检查他们是否发送 session key 变量以及用户 ID 和密码。如果不是,则根据当前服务器时间和密码生成一个,然后将其传回客户端。将其及其创建时间存储在您自己的数据库中。然后,当客户端发出包含 session key 的请求时,您可以通过直接将其与数据库中存储的 session key 进行比较来验证它,而无需哈希。只要每隔几个小时使 key 失效一次,就不会有太大的安全问题。不过,如果您当前以明文形式发送密码和用户 ID,那么您已经遇到了安全问题。

关于web-services - 针对多个请求的高效密码散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8376101/

相关文章:

php - MySQL/PHP 忽略现有用户(有时)

python - Gae/cloudsql错误: Access denied for user 'root' @'cloudsqlproxy

java - GAE 无法使用 Java 的 Send Grid 发送邮件

sql - 用于解码 SQL 注入(inject)尝试、定位漏洞的工具

.net - 什么会导致调用 Web 服务出现两分钟的延迟?

java - 如何使用 URL 测试 REST WS

java - JAX-WS Web 服务线程模型

.net - 如何保护 .net 中的网络服务?

google-app-engine - Google App Engine 上的搜索 API

web-services - 为什么需要为 int 和 Data 而不是为 String 设置 Web Service DataMember 的指定属性