0

假设用户使用基本身份验证提交其凭据。我有一个自定义消息处理程序,它从标头中检索凭据:

protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
                                                                               System.Threading.CancellationToken
                                                                                   cancellationToken)
        {
            try
            {
                // Request Processing
                var headers = request.Headers;

                if (headers.Authorization != null && SCHEME.Equals(headers.Authorization.Scheme))
                {
                    Encoding encoding = Encoding.GetEncoding("iso-8859-1");
                    string credentials = encoding.GetString(Convert.FromBase64String(headers.Authorization.Parameter));
                    string[] parts = credentials.Split(':');
                    string userId = parts[0].Trim();
                    string password = parts[1].Trim();
                    // TODO: Authentication of userId and Pasword against credentials store here

我想知道 - 当我在这里实际验证用户 ID 和密码时,我很想将这种方法的明文与存储在数据库中的明文进行比较,但我知道这是不安全的。我是否应该同时对来自标头的明文和存储在数据库中的凭据进行哈希处理以进行间接比较?

如果是这样,在它们被散列之前,似乎凭证在消息处理程序中是纯文本的。这是否存在任何类型的安全漏洞,或者可以吗?

4

2 回答 2

1

有运动的数据和静止的数据。散列通常用于静态数据,特别是密码类型的东西,用户将提交未散列的表单供您散列并与权限进行比较。如果您担心存储的密码是否清晰,请将其散列并存储。从标题中以明文形式检索密码,对其进行哈希处理并与数据库中的密码进行比较。如果您担心通过网络发送密码,则不应使用基本身份验证。

于 2013-04-12T17:34:10.217 回答
0

SSL 涵盖了在通过网络传递凭证时以明文形式提供的凭证。

密码绝对应该在数据库中进行散列和加盐处理,并且永远不要以明文形式保存在任何地方。

如果有人对您的服务器进行内存抓取,那么将密码保存在服务器上的字符串变量中确实是个问题。如果发生这种情况,你就会遇到更大的问题。如果您担心最小化该可用性窗口,您可以从标题中获取密码并将其放入字节数组而不是字符串中,这样您就可以在完成后立即清除字节数组。但是,该值已经存储在 中的字符串中headers.Authorization.Parameter,因此可能不会给您带来太多好处。

于 2013-04-12T18:17:00.877 回答