【问题标题】:Objective C - Salt / MD5 hash?目标 C - Salt / MD5 哈希?
【发布时间】:2012-02-06 01:20:25
【问题描述】:

我正在创建一个需要身份验证的应用程序,我已经在 XCode 中使用登录视图。我当前使用的方法构建了我提交到服务器的 URL,但它以普通测试的形式提交登录名和密码,如下所示:

http://myurl.com/auth.php?email=email@domain.com&password=mypassword

我确实收到了一些含糊的建议,他们使用了“盐和哈希 40 字符令牌”,但无法看到这是如何/在哪里完成的。我可以在服务器端执行一些操作来操作数据,但需要能够对我在 xcode 中所做的任何事情进行去盐/去哈希处理 ..

有没有办法让 Objective C 提供所提供密码的 MD5 哈希,以便在我提交 URL 请求之前 URL 请求中的文本已经加密?我可以在服务器端 PHP 中验证提供的 MD5 哈希是否与数据库的 MD5 哈希匹配,因此如果可能的话,这将是完美的。

如果没有,那么我需要为我可以在 Objective C 中创建的盐/哈希创建一个方法,它必须是我可以在 PHP 中解开的东西,以便与我的数据库进行比较。

提前致谢。

银虎

更新:2012 年 1 月 14 日

不幸的是,服务器和 SSL 选项不受我控制,尽管我可以提出建议。我将不得不进一步研究 SHA1 和/或 base64,以便我可以在应用程序中创建哈希并在服务器上重新创建/比较它。在我获得 SSL 之前,任何指向体面阅读的指针都将不胜感激。

【问题讨论】:

  • 如果您控制服务器,您可以使用 HTTPS 而不是 HTTP 并加密整个连接。

标签: objective-c xcode md5


【解决方案1】:

您可以使用 OpenSSL C functions。然后,您需要将输出转换为可以在 URL 中编码的内容。虽然您可以将输出转换为十六进制,但通常使用 base64。

注意,如果您可以控制连接的两端,请注意 MD5 不再被视为加密安全。您可能需要考虑使用 SHA 哈希系列之一。

【讨论】:

  • 只是为了支持这一点:通过 HTTP 发送散列密码是一个非常糟糕的主意,比使用 SSL/HTTPS 糟糕得多。这是因为对于具有足够技术知识的人来说,将您的应用程序分解并弄清楚您在用什么腌制是相当微不足道的。
【解决方案2】:

无需“能够对我在 xcode 中所做的任何事情进行去盐/去哈希处理”。 这不是密码学的工作原理。

只需将输入文本的哈希值与预期文本的哈希值进行比较即可。

服务器可能会给你登录+密码的哈希版本 只需在 Xcode 中计算您输入的登录名+密码的哈希值,然后比较两个结果。

if ([response_of_server_containing_sha1_of_password equalsToString:[self sha1OfString:password_string_entered_by_user]]) ...

或者更可能这种比较是在服务器端完成的,这意味着您可能会将sha1(password_entered_by_user) 发送到服务器,然后他们会将其与他们存储在数据库中的密码的 SHA1 进行比较。

无论如何,这里不需要双向加密,也不需要解密(“解密”/“去散列”)任何东西。

您显然需要从实现身份验证服务器的服务器端的人那里获得更多信息,如果他们没有为您提供所有需要的信息,例如他们希望您发送哪个哈希(md5?sha1?)等.

(无论如何,请注意,以这种方式进行身份验证不会保护站点免受 MITM 或重放攻击等安全漏洞。如果您需要更好的安全性,请考虑使用 SSL / HTTPS)

【讨论】:

  • 服务器实际上只是我编写的一个 php 页面和一个保存密码 MD5 哈希值的 mysql 数据库 :)...我想我得再读一些。
  • 那么典型的解决方案很简单:让你的 iPhone 应用程序发送用户输入密码的 MD5,然后在服务器端,将收到的 MD5 与存储在你的 mysql 数据库中的进行比较,然后最后让你的服务器回复 OK 或 KO 告诉你的 iPhone 应用密码是否正确。
  • 请注意,这是一个非常简单的解决方案,但并不真正安全。首先,现在更喜欢使用 SHA1 而不是 MD5。无论如何,我描述的这个程序不会非常有力地保护你,至少不会受到 MITM 攻击。因此,如果您真的不需要强大的保护,而只需要基本的保护可能就足够了,但如果您需要更强的保护,请考虑至少使用 HTTPS 和/或其他方法(证书、OAuth 等)。这更难理解和实现,所以当然只有在你需要一些真正的保护时才这样做。
  • 不幸的是,服务器和 SSL 选项不受我的控制,尽管我可以提出建议。我将不得不进一步研究 SHA1 和/或 base64,以便我可以在应用程序中创建哈希并在服务器上重新创建/比较它。在我获得 SSL 之前,任何指向体面阅读的指针都将不胜感激。
  • Base64 不是加密哈希。它是一种内容传输编码。它不会加密任何东西(也不是故意的)。请注意,与 MD5 或 SHA1 哈希函数(反过来只计算字符串的哈希(不可逆确定性满射函数))具有相同的目标,并且与 RSA/PKCS1 等算法中使用的私钥和公钥对具有不同的目标。在 SSL 中)
猜你喜欢
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2019-10-10
  • 2015-07-07
  • 2012-08-17
  • 1970-01-01
相关资源
最近更新 更多