【问题标题】:Is there any alternative to obfuscation to make it harder to get any string in javascript?是否有任何替代混淆以使在 javascript 中获取任何字符串变得更加困难?
【发布时间】:2010-03-20 19:12:31
【问题描述】:

我使用DropBox,但在从其他计算机访问我的文件时遇到了一些问题: 当我在公共计算机上时,我并不总是想登录任何东西,但我喜欢能够从任何地方访问我的东西。

所以我做了一个简单的应用程序,当放入公用文件夹时,运行并提供正确的 UID,创建(仍然在您的公用文件夹中)文件夹(包括子文件夹)中所有内容的 HTML 作为树链接。

但我没有冒险将它加载到任何地方,因为那里有些私密的东西(是的,我知道文件夹的名称是“PUBLIC”)。

所以我想出了一个想法,让它成为一个简单的登录页面,只要输入正确的密码,页面的其余部分就会加载。太棒了!但是如何?

如果我通过重定向到同一文件夹中的其他 HTML 来做到这一点,我仍然会将 html 链接放入网络历史记录和管理员的“url 的访问”历史记录中。所以我应该在同一个页面中生成它。

我做到了:

alt text http://dl.dropbox.com/u/3045472/validate.png

当前页面是一个文本框和一个按钮,只有当您输入正确的密码(在生成器中定义)时,页面的其余部分 (with the link-tree) 才会加载。错误在于一切(密码、URL)都可以通过源代码轻松访问。

现在,假设我只想避免愚蠢的人太容易获得它,而不是制作一个防弹的所有内容持有 NSA 认证的网站,我想一些方法来使这些信息成为有点难得到。

正如您可能已经想到的,我使用流写程序来编写一个 html 文件(头部、循环链接、底部),然后它的可配置性非常高,我可以想出一个非常混乱但可以工作的 c# 代码,虽然我的javascript知识不是很好。

DropBox 中的公共链接如下所示:

总结:如何隐藏 URL 和密码以在我的源代码中显示它们(当然主要是密码),这样就不需要花一些精力阅读?

P.S.:这不是私人的,如果有人真的想要它,它永远不会受到 100% 的保护,如果它那么重要,我也不会把它放在公共文件夹中,如果这家伙真的想那么努力,他应该得到它。
P.S. 2.:“使用 Ultra-3000'tron 混淆器!!11”不是一个真正的答案,因为我的 javascript 是由我的 c# 程序生成的。
P.S. 3.:我不希望其他解决方案为“使用服务器端应用程序并将其托管在某个地方以重定向和bla bla”或“压缩.RAR文件中的链接并在其中输入密码”,因为我'我这样做也是为了学习,我想要它的快感 =)

更新 1: 到目前为止,一个答案提供了一种完美的方式(根据这个问题)来隐藏我的密码。
现在我想要一个隐藏 URL 的好方法,可能是我给出的示例 URL 的代码 sn-p,如果它太棘手,可能如何在 C# 中生成它,或者任何东西?

更新 2: 我考虑过可能制作三个“混淆方法”并在运行时随机选择它们。因此,任何想出如何阅读一个 XML 的人,只能阅读其中的三分之一,并且可能很难找到这三分之一的其余部分......

更新 3:
想想 REGEX,URL 可能会被随机添加的虚拟非 url-allowed 字符整齐地挤满,这些字符会被以下内容删除:

regex.replace(url, ^[^\w\d/:-\.%]+$,"")

所以,这个爱管闲事的家伙在编程方面应该有相当高的水平,是吗?谁能告诉我它是否有效?

【问题讨论】:

  • 这是一个有趣的问题。希望你能得到一些好的答案。我邪恶的一面很想回答“写很多意大利面条代码”,但我不会那样做。 :)
  • 意大利面条代码会不会不使用方法或循环,并使其全部成为单行错误代码?这还不够……应该组合 URL,并且在源代码中通过“http://”搜索不应返回任何完整的 URL。

标签: javascript c# .net obfuscation


【解决方案1】:

好吧,您似乎已经知道,这是一个相当糟糕的安全机制选择,但如果您坚持...

不要将实际的字符串存储在源代码中。例如,存储它的MD5 hash。然后,当用户输入密码时,计算其 MD5 哈希值并将其与预期值进行比较。

退房:

【讨论】:

  • 哇!我就是这个意思!非常感谢..仍在等待同样好的答案!我可能会应用多个解决方案 =)
  • 我想我已经知道隐藏密码了。现在隐藏 URL 怎么样?
  • 没问题 :) 这不是我的主意,许多系统存储密码哈希而不是密码本身。对于 URL,您必须使用可逆加密机制。看看en.wikipedia.org/wiki/ROT13,也许它会激励你做一些更好的事情。
  • 另外,请注意“智能”攻击者不会尝试从哈希中猜测密码。那将花费太长时间。您更有可能让人们尝试使用您自己的代码提取 URL。
  • 是的,但我之前没有考虑过使用哈希,如果密码以某种方式可逆,那么将 100% 的精力用于提取它会产生一个漂亮的、功能齐全且有条理的链接树我所有的东西..哈哈。阅读[edit 2],它有一个新想法..
【解决方案2】:

为了详细说明 miorel 的想法,您还可以使用密码作为密钥来加密整个页面。基本上,将所有内容编码成一个大字符串,询问密码并解密该字符串。如果密码错误,它会显示大量垃圾,就是这样。喜欢

 content = "encrypted string"

 function decrypt(str, key) { your algorithm of choice here }

 document.write(decrypt(content, prompt('Password?')))

您唯一需要的是 javascript 中的解密实现 - 但这很容易通过谷歌搜索出来,例如 here 或 here。

这也会使单独的“登录”页面变得无用。

【讨论】:

  • 它不是一个单独的页面(阅读第5段),文本框+按钮首先出现,如果密码正确,则两者都消失并且页面结束渲染,非常整洁=)
  • 顺便说一句..加密内容..那是非常邪恶的!我一定会这样做的!但是功能就在那里.. 在学校学习了 3 个月的网页设计的人可能会忘记密码,获取功能(是否混淆......没关系)并在新的 HTML 中运行它......但我们继续正确的轨道!
  • 第一点:如果攻击者禁用 javascript 并仅加载整个页面会发生什么?第二:如果攻击者不知道密码,解密功能本身对攻击者是无用的。
  • @stereofrog 出现 html 输入,并且按钮不起作用,因为树是由 javascript 打印的;)
  • 攻击者不需要“树”。他想要你的链接,它们只是在代码中,对吧?
【解决方案3】:

当然,这类似于询问您如何在没有人看到您的情况下在公共场合脱衣,​​但鉴于此,我假设您尝试存储的密码是 DropBox 的密码。我想您可以混淆密码并将其存储在cookie中。这至少可以防止有人简单地查看源代码来查看密码,但显然不会阻止有人运行 Fiddler 之类的东西并看到它。

[snipped server side suggestion]

编辑: 要处理 URL,为什么不简单地构建 url 并让链接调用 javascript 函数来获取 url?您的服务器端代码将使用混淆的 url 在此函数中填充一个数组,调用代码只需将索引传递给数组。因此,在查看源代码时,除了静态不安全链接之外,任何地方都不会出现“http”实例。

添加好的。现在我对这个问题有了更好的了解,更容易设计解决方案。有一些库可以在 javascript 中进行网络加密(例如 http://point-at-infinity.org/jsaes/),但问题归结为密钥管理。由于它的 javascript,它将是公开的,但是您可以设计一些箍来使其更难确定密钥。通常,这些技巧涉及间接。例如,存储由 C# 代码生成并存储在 HTM 文件中的冗长随机字符流(例如 40-50 或更多)。此外,C# 代码会将一个数组数值存储到您的 javascript 函数中,这些数值表示指向 C# 代码用于加密密码(或只是整个 url)的长文本流的指针。

【讨论】:

  • 你错了..这是查看 HTML 本身其他链接的密码!再次阅读第 6 段!关于使用服务器端的东西,阅读 PS3,我想学习混淆,也不要依赖主机并且每次都必须更改那里的链接..谢谢!
  • 但是您已经在 C# 中使用服务器端解决方案。中途停下来似乎很愚蠢,尤其是当您要使用的工具不是为此而设计的时。关于 Urls,另一种混淆它们的解决方案是使链接调用一个 javascript 函数,该函数查询一组混淆链接。 TBH,我不确定我是否理解您在第 6 段中要说的内容。您能否修改您的帖子以显示链接的样子?
  • 这是一个 EXE,我有时会在公用文件夹中运行它以刷新也在公用文件夹中的 .HTM。没有服务器端应用程序,没有 ASPX,没有主机。这是一个生成带有链接的 HTML 的 winforms 应用程序。感谢您提供一系列混淆链接!那很整洁!我现在将编辑第 6 段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 2014-07-02
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多