Settings

Theme

Password protect a static HTML page, decrypted in-browser in JavaScript

github.com

141 points by olestr a year ago · 47 comments

Reader

Rygian a year ago

> returns a static HTML page showing a password prompt that you can now safely upload anywhere

Anywhere that you trust, and where the page is hosted securely. For example, a malicious hosting service could alter the password prompt. Or the page as a whole could be put in a frame with a transparent overlay.

  • rafram a year ago

    Clickjacking has been a solved problem for over a decade. Set X-Frame-Options: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-...

    • Rygian a year ago

      Hence the need for a hosting service that you trust. You can't force that header on an untrusted server.

    • iAMkenough a year ago

      How do I set this in a shared hosting environment like GoDaddy?

      • rubendev a year ago

        You can set a CSP in the HTML head section using a meta http-equiv tag. It has similar functionality to X-frame-options IIRC.

        • lelandfe a year ago

          Alas, no. ‘frame-ancestors’ does not work in meta. There is no reliable way to prevent click jacking if you are just editing the HTML. That makes sense: in order for these meta directives to even be enacted the HTML will have already begun to download and be parsed.

          The old school way is comparing the top level URL with JS and redirecting but there are ways to deal with that

    • cute_boi a year ago

      is it not by default? If no, then i would consider it as a bad design.

    • indigodaddy a year ago

      or even better CSP options no?

  • yoble a year ago

    (author here) Yeah, or if it's on http someone could MITM and change the script, or if they are malicious extension on the browser the content can be stolen after decryption.

    That felt implicitly obvious to me, but I think you're right and it wouldn't hurt to put those assumptions in the FAQ. Thanks for the feedback!

    (If you, or someone else, see other attack vectors, feel free to comment with those)

    • ranger_danger a year ago

      a supply-chain attack where malicious JS is delivered to the user (even from your own server, as the author of the software, maybe you got hacked yourself for example) is another way

    • atVelocet a year ago

      Would it help to employ the ssl cert in the encryption/decryption process and use it as an IV or so?

yoble a year ago

Author here. I was wondering why I was seeing plenty of people from github on my meditation website so I checked HN, hi!

Happy to answer any question you might have, and feel free to offer feedback too.

(Last time this got posted to HN[1] was really productive in improving the project, thanks!)

[1] https://news.ycombinator.com/item?id=34849024

  • ayewo a year ago

    Well done on getting your project linked here again on HN.

    > I was wondering why I was seeing plenty of people from github on my meditation website so I checked HN, hi!

    I'm curious: how did you notice this? You happened to be viewing your website stats or your analytics tool was setup to notify you when you receive a surge of traffic :)?

    • yoble a year ago

      Just random chance!

      I recently launched another project with an interface to search and filter blog posts from a prolific blogger I really like, using AI tech. He featured the website on his blog last week which draw a pretty big spike in traffic - well, big for me, like a few thousands people - so I've been refreshing my analytics tools from time to time to follow what's happening, and I just noticed a spike on my other website as well.

dividuum a year ago

Built the same thing, but with a slightly different focus: Have the result as small as possible, so assuming you can trust your browser you can audit the received HTML file prior to entering your password: https://github.com/dividuum/html-vault

whycombagator a year ago

Similar project that supports files: https://github.com/mprimi/portable-secret

  • yoble a year ago

    Oh cool that looks awesome thanks for sharing! Are you the maintainer?

    I saw that StatiCrypt is listed is the alternative section of your README, I'll do the same on StatiCrypt (and add a bunch of the one listed there that I didn't know about!)

    The "Alternatives" section of StatiCrypt has always felt a bit empty to me, I'm glad to discover all those great looking projects and beef it up a bit. :)

benterix a year ago

In the old days, we used .htaccess and htpasswd for that.

  • yoble a year ago

    Yeah definitely! StatiCrypt was originally created to password protect pages uploaded on static hosting (like Github pages) or where you didn't have control on the server.

    It has some valid other use cases but it has drawbacks too and htpasswd can definitely be the better solution in many situations. StatiCrypt just aims at being another tool with different trade-offs.

ImpostorKeanu a year ago

Reminds me of one of my projects:

https://github.com/blackhillsinfosec/skyhook

Round-trip encrypted file transfer. Uses WASM to decrypt files on the client side.

Aims to bypass IDS.

sowbug a year ago

Similar (but also for a narrower use case with fewer features): https://github.com/sowbug/quaid

It wraps a JS implementation of only the decryption side of GPG symmetric encryption, so there's less opportunity for the tool itself to introduce security errors.

PUSH_AX a year ago

I used this before and it was really decent, actually had it as a build step on some dev preview stuff. Only moved to basic auth because getting it to remember people through re-deploys was a faff so it became annoying when it wasn’t working (I’m aware it has a solution to this problem but it wasn’t really working for me easily)

  • yoble a year ago

    Glad you enjoyed it before switching!

    If you're open to sharing what didn't work for you in remembering people through re-deploy I'd love to hear it, I spent quite a few brain-cycles to think about making that as seamless as possible for the user (semver major version bump shouldn't break this, for example).

    I'm assuming the problem is the salt being changed if it's not pinned by the .staticrypt.json file (auto-created but needs to be commited) or the `-s <salt>` CLI option.

jszymborski a year ago

Another interesting project allows you to do a similar thing with Hugo. I'm a bit nervous to use these myself but seems useful for some limited, non-serious use cases.

https://github.com/Izumiko/hugo-encrypt

p0w3n3d a year ago

How long should the password be to make this safe from brute force attack?

irundebian a year ago

Nice project. There should be some project which standardizes a mechanism to do that that with a browser extension. This would make it possible to share websites without trusting the web hoster.

dxxvi a year ago

This is what I'm looking for: a way to put something in public (I'm using Vercel) that "only" me can access (anybody who can decrypt it doesn't need the content that I encrypt).

WeEatnKid a year ago

As an alternative, your content can be stored statically on a request path that is the hash value of a secret

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection