将自定义用户提供程序与散列密码与 http basic 结合到后端 api

Posted

技术标签:

【中文标题】将自定义用户提供程序与散列密码与 http basic 结合到后端 api【英文标题】:Combine custom user provider with hashed passwords with http basic to backend api 【发布时间】:2012-04-16 02:08:55 【问题描述】:

我有一个 REST API 和该 API 的前端,它们都是用 Symfony2 编写的。 在前端,我编写了一个自定义用户提供程序来在前端创建一个用户对象,基于来自后端的信息,如(散列)密码、盐等。 根据本文档:http://symfony.com/doc/current/cookbook/security/custom_provider.html

但是,对于我的大多数 API 请求,我需要 HTTP Basic 身份验证凭据。但据我所知,对于 Basic,我需要明文密码。我在前端没有,我只有自定义用户提供程序的散列版本。

我能否以某种方式使用带有该哈希密码版本的 HTTP 基本版本? 或者我可以在前端拦截登录表单的 _username 和 _password 字段,并将它们保存在会话中(不确定这是否正确,但现在可以修复它)

我尝试了后者,通过将登录表单发布到我自己的 URL 而不是“login_check”,所以我可以看到 _username 和 _password 字段,但之后我需要将其转发到 '/login-check ' 让 Symfony2 做到这一点很神奇。但是这一直失败,因为他“找不到控制器”(正常使用时,Sf2 在没有我设置控制器的情况下拦截 login_check 调用,但我想当你开始弄乱它时它不会)

欢迎任何建议,

干杯,

节食

【问题讨论】:

为什么不为后端和前端使用相同的防火墙? 你能详细说明你的意思吗?我不认为我跟随。两种防火墙的情况完全不同:后端由 http basic auth 组成,是无状态的,而前端肯定不能是无状态的,需要通过表单进行身份验证,而不是 HTTP Basic。 【参考方案1】:

如果您在将密码传输到服务器之前对密码进行了哈希处理,那么这个哈希密码将成为新密码。

HTTP Basic Auth 通常用作 RESTful 身份验证方法,但它必须通过 SSL。如果您使用加密 nonce 作为会话 id,您仍然需要通过 SSL 为所有请求传递此值,否则您将违反 OWASP A9 并且所有用户都可能受到损害。

【讨论】:

所以你的意思是在前端而不是后端散列它?因此,例如在前端使用 sha512 对其进行散列,然后在后端将其保存为“纯文本”(实际上是 sha512 散列)?可以工作,肯定是原始解决方案。完全同意 SSL,我是 Owasp 的忠实粉丝,所以我正在尽我所能保证它的安全。 @Dieter 然后,您将存储不是 RESTful 的每用户服务器端统计信息。如果您要打破 REST 安全规则而不是使用会话 id+ssl,那么您会更安全。 我要存储在后端的数据库中,无论如何我都需要做 ;-) 不像 API 端的会话管理那样存储。

以上是关于将自定义用户提供程序与散列密码与 http basic 结合到后端 api的主要内容,如果未能解决你的问题,请参考以下文章

数据库系统概念笔记——第十一章:索引与散列

字符串比较与散列

对索引存储与散列存储的一些形而上的思考

java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列

Redis数据操作--字符串与散列键的区别

Redis数据操作之字符串与散列键的区别 | Redis