HN user

lonestar

220 karma
Posts3
Comments49
View on HN

I released the first public version of Phactory yesterday, and I'd like to get some feedback from developers here on HN.

Phactory was born from a desire to have something like Factory Girl for my day job writing PHP. A couple of my co-workers and I have been using it for a few weeks now, and we're finding it really useful.

If you have time to give it a try, any feedback/criticism would be much appreciated.

What features would you want to see in a library like this?

"Password hashing scheme" refers exclusively to the algorithm used to transform a plaintext password into a ciphertext value (whether it's a hash or derived-key).

The rest of your library is the part you want to spend your effort on. Make it easy to use, make it flexible, put in some great features like a user admin panel. That stuff is the domain of the webapp library builder. Just trust the crypto part to the cryptographers, and use bcrypt/scrypt.

If you're offering it for public scrutiny, then the good news is you've just gotten a good bit of it from an experienced security professional. Perhaps instead of calling tptacek arrogant, you could take the criticism that you say you're inviting?

The best practice in password hashing schemes is well understood by the security community, so you have to understand that it can be frustrating to watch the same mistakes made over and over again.

As tptacek pointed out, the correct answer is "use bcrypt". He's not telling you not to offer your library for public use, he's just pointing out that there is absolutely no reason to roll your own password hashing scheme.

"Also, could I not continue using SHA2 256, and add an option to specify the number of hashing repetitions, which would increase the time to compute, as well as frustrate dictionary attacks?"

Are you sure there is no inherent property of SHA256 that would allow an attacker to shortcut the computation of successive hashes? I'm not saying there is, but simply that cryptographers have already solved this problem and considered all the angles. Why are you trying to start from scratch?

Actually, slow in this case does not at all mean "this operation isn't implemented in hardware or optimized assembly".

The slowness of an algorithm like bcrypt is a tunable property of the key expansion algorithm. A step in this process will be repeated 2^n times, where n can be configured by the user.

If a password function was only slow because it wasn't implemented in assembly on your server, an attacker would obviously just go implement it in assembly for his brute-force crack.

In what way is pushing 20K requests/second "concurrency fail"?

Node.js doesn't make it easy to share state between processes, but once you're scaling to multiple processes, the jump to multiple machines probably isn't far behind. You'll need to design a distributed algorithm, or just centralize your shared state in something like Redis anyway.

"Oh well, better for the rest of us."

Do you really think so? I'd prefer to live in a society where everyone was well-educated, or at least enjoyed learning.

I think you'd find there is some spillover benefit for yourself to be had from "these low-income and minority kids" receiving high-quality education.

Perhaps they should have announced the monthly fees before the delay. I'm more than a little disappointed to find out that I'm not getting it on time, and that I might unexpectedly have to pay a monthly fee once it does ship.

I think it's odd that you have such a problem with co-opting the use of "Re:" (even though you admit he is using it in the original sense), but you don't have an issue with him co-opting the English language by intentionally misspelling words.

Besides, when a customer requests pricing, many systems will send an e-mail to the salesperson who can hit "reply" to send an e-mail to the customer.

> Either given enough people poking at it intelligently, or a enough computers brute forcing it nearly anything can be cracked.

That's technically true, but the time frame it takes to find an algorithmic weakness or complete a brute-force is the important factor here. It comes down to a question of how long your data needs to remain confidential.

As is usually the case, no cryptographic primitives were subverted to 'break' the USB stick. A somewhat silly implementation flaw is to blame.

Secret language 17 years ago

Jargon arises because it is useful for compressing information exchanged within a given culture. If this really was an internal posting which was accidentally exposed, what is the problem with using the jargon of Microsoft's culture?

The hash could be used as the response in a consensus protocol, but it looks like Enchilada leaves building that protocol up to the developer.

So like I said, it's nice to have that hash for every reference, but I wonder if it's worth the storage overhead, and if a developer will use it when he's building his own distributed system anyway.

[dead] 17 years ago

I agree with you that it's inconvenient, but I can't think of an alternative that would be fair to both Zipcar and the renter. If I let Zipcar inspect the car and take their word that there's no damage, I'll be on the hook for $500 if they miss something. On the other hand if they trust me that I didn't damage it, they lose money if I'm lying.

As an aside, I generally do a quick walkaround on my car before driving away. Check for low tires, see if somebody banged their door into it, etc. For my motorcycle there are even more things I check each ride for safety reasons. It's inconvenient, but worth it I think.

[dead] 17 years ago

"...if a Zipster before you didn’t report their scratch and dent (and the Zipster after you does), that you’ll end up on the hook for the $500 damage deductible for something you didn’t do since you didn’t do the walkaround and report the damage"

It seems like the author is really stretching for things to complain about. If you neglect to inspect the vehicle for damage prior to driving it, what do you expect?

The section on "verifiable computation" is interesting: http://www.enchiladacode.nl/technology.html#verifyable

"Every ID of an Enchilada Value is calculated by taking the SHA1 hash of the Value's contents."

The docs suggest that this can be used in a consensus protocol. Many nodes can compute the same result, and quickly test for equality by comparing the ID. Seems nice to have this built-in to the language, but I have to wonder:

a) Why SHA1? Why not a member of the SHA2 family? b) If you're creating a distributed system and want to implement a consensus protocol, a hash ID isn't really sufficient. Who is going to end up using this feature?

He said he put his ego aside in regards to redesigning his webapp to appeal to a wider audience, rather than what he wanted.

It doesn't seem terribly egotistical to want to correct people who are spreading an inaccurate representation of his product.

These interview questions were about Ruby, not Rails.

If you are hiring for a position where the developer will work primarily with Ruby, it makes sense to ask Ruby-specific questions or have a Ruby coding exercise. That shouldn't be the whole interview of course; as you mention, an all-around strong candidate is preferable.

That said, the questions in the article don't require much Ruby experience. Anyone with a grasp of OOP concepts could probably get most of them right.

When Rails Fails 17 years ago

If you're not a Ruby/Rails dev, it doesn't seem reasonable to expect that all the framework's errors will make sense to you. If you took the time to learn how requests are routed in an MVC framework, this particular error would probably make perfect sense to you.