>>> from hashlib import sha1
>>> def check_pass(plaintext, offset=5):
hashed = sha1(plaintext).hexdigest()
return (hashed, '0' * offset + hashed[offset:])
>>> check_pass("linkedin")
('7728240c80b6bfd450849405e8500d6d207783b6',
'0000040c80b6bfd450849405e8500d6d207783b6')
Edit: I'm pretty sure JtR refers to this: http://en.wikipedia.org/wiki/John_the_Ripper perl -MDigest::SHA -le '$h = substr( Digest::SHA::sha1_hex($ARGV[0]) , 5 ); open F, "<combo_not.txt"; do { print "found $_" if grep(/$h/, $_) } while (<F>)' password
(for people without shells) grep `echo -n password | shasum | cut -c6-40` hacked.txt grep `read -sp "password: "; echo "$REPLY" | tr -d "\n" | shasum | cut -c6-40` hacked.txtI thought 16k entries might be reasonable but that doesn't even last 3 weeks for me. I think there might have been some issue with slow disk seeks so at some point I restricted it to that many.
I guess it probably it would be better to regularly backup the history file to deal with possible some accidental truncations and issues when running multiple shells concurrently, but probably the overall effort to set up such a system would outweight the benefits.
kill -9 $$Kill -9 -1 as root is a surefire way to make a system stop doing anything, fast.
$ echo linkedin | xargs node -e "var x = require('crypto').createHash('sha1').update(process.argv[1]).digest('hex'); console.log([x, '00000' + x.substring(5)]);"
7728240c80b6bfd450849405e8500d6d207783b6
0000040c80b6bfd450849405e8500d6d207783b6DDG supports SSL: https://www.duckduckgo.com/
If you want coverage, generate a few hundred thousand SHA1 hashes along with your password.
Actually, running a trickle query of random SHA1 hashes from your box might be a fun exercise, along with a trickle query of random word tuples (bonus points for using Markov chains to generate statistically probable tuples).
At worst you're giving the attacker a hash target to try brunting. He still has to brute it, and that takes time. Select your plaintext from a large enough keyspace and it's astronomical time.
I'll need to review their policy more closely, but DDG claim fairly minimal tracking. At best someone might be able to correlate hash lookup with some IP space. That's a long way from handing over passwords. And as I already indicated, you could cradled the queries to make the search space much larger.
When you search for 'sha1 foo', that query ("sha1 foo") goes up to the server. They know your password is "foo" and that you're attempting to "sha1" it. They don't have a hash, they take that data and perform the hash, then send that down to you.
OK, gotchya.
I guess I'm just too damned used to using systems that, you know, have useful tools installed locally (or can get them there really damned fast). Including SHA1 and MD5 hash generators.
And I was all worked up to tell you how wrong you were still being.
All because I couldn't fathom the possibility let alone reason anyone would need a third-party site to compute their hashes for them.
Silly me, my error.
curl -s -d q="sha1 password" http://duckduckgo.com | w3m -T text/html | grep '\w\+\{32\}'
" xargs node -e "
do?
Thank you
$ node -e "console.log('Hello, world.')"
Hello, world.
[xargs] allows you to pipe the output of one command as an argument to another command. By default it will show up at the tail end of the second command's arg list, but if you want to interleave it you can use -I flag: $ echo /usr/share/dict/words | xargs head -5
A
A's
AOL
AOL's
$ echo petard | xargs -I {} grep {} /usr/share/dict/words
petard
petard's
petards
[xargs node -e] therefore allows text from STDIN to inserted into a script to be evaluated by the node interpreter, accessible via process.argv: $ echo is dog this yes | xargs node -e "console.log(process.argv.slice(1).sort().reverse().join(' ').toUpperCase())"
YES THIS IS DOGsame result as with xargs
grep petard /usr/share/dict/words
same result as with xargs
not sure what you are trying to demonstrate here
useless use of xargs?
Are you even reading this discussion properly or are you just searching for some shell snippets and ridicule them as soon as you get a chance? This is what it looks like from your history: http://news.ycombinator.com/threads?id=uselessuseof
ionwake doesn't want to learn how to search a word. He wants to know how 'xargs node -e' works. Please read this again: http://news.ycombinator.com/item?id=4075293
$ echo linkedin | xargs node -e "var x = require('crypto').createHash('sha1').update(process.argv[1]).digest('hex'); console.log(x.substring(5));" | xargs -I {} grep {} hashes.txt
I'm surprised at the backlash to what I thought was fun code golfing. No one called me names after I posted a simple Python solution that didn't check the file. For what it's worth I've changed my LI password and I haven't bothered downloading the actual hash file.Personally, while I don't, I do tend to get a little aggressive and then I'm often surprised with the backlash, because I get that way when I'm genuinely enjoying the conversation, not when I'm irritated.
The hypocrisy is so unabashed my brain might explode.
- not portable
- useless use of backticks
printf password|openssl sha1|cut -c6-40|grep -f - hacked.txt
perl -MDigest::SHA=sha1_hex -le '$h = substr( sha1_hex(shift), 5 ); open F, "<combo_not.txt"; print "found $_" for grep /$h/, <F>' password
Or: perl -MDigest::SHA=sha1_hex -lne 'BEGIN {$pw = shift} $h = substr( sha1_hex($pw), 5 ); print "found $_" if /$h/' password combo_not.txtwhile read line; do echo -n $line | sha1sum | cut -c6-40 | awk '{print "00000" $0}'; done < rockyou.txt
I haven't tested that, but I think it'll work.
I now have a good appreciation of why it's considered a "Write once, read never" language. :)
>>> import getpass
>>> password = getpass.getpass('Password: ')
http://docs.python.org/library/getpass.htmlgrep `echo -n l1nked0ut | shasum | cut -c6-40` combo_not.txt
000000afef5f2ba94b104126d04db1837f423816
e7bf10afef5f2ba94b104126d04db1837f423816 $ cat combo_not.txt |cut -c7-40 |sort |dups |wc -l
670781
That's ~10% of the total.cut -c7-40 combo_not.txt|sort|dups|wc -l
what the heck is dups?
cut -c7-40 combo_not.txt|sort|uniq -d|wc -l
dups is indeed a little helper of mine. Like uniq it only handles sorted input. Update: I see you edited your answer to include uniq -d. I wasn't aware of the option, thanks. Now I can simplify the implementation of dups. But I find the name valuable, and I think it's perverse to say uniq when you mean its opposite.
The input file is reliably the second word, so C-A M-f gets me to it if I want to operate on a different file. !!:1 gets me the file if I want to use it in a new command.
1. cat file
2. cat < file
3. echo abc|cat
4. echo abc|cat - file
cat can take input from the left, the right, or both
same goes for cut
I could keep the file first by saying:
$ < combo_not.txt cut -c7-40 |sort |dups |wc -l
To which I reply, "Yuck!"Perhaps we should stop here. You seem to have made this account just a few hours ago for the express purpose of poking at people's code fragments in this thread. You're making stylistic nitpicks (they don't affect correctness, do they?) and you're making them in a tone that I'm not sure I would take from Randal Schwartz himself (you actually edited http://news.ycombinator.com/item?id=4076556 to be ruder than the original). It's a drag, man.
cut -c4-70 combo_not.txt|...BTW, HN has some formatting support: http://news.ycombinator.com/formatdoc
AxEWS9rg5V
This is the sha1:
caf28fcc9c3e4d88b830b8e5cc52c5b65d3db5f4
It is found in Line 3612910 of combo_not.txt. I believe the file is authentic.
What if they also (or actually) compared password hashes from their database to the ones released in the Gawker breach? In that case, they likely wouldn't have pulled data straight from the database but actually might have pulled passes from the db, output to text files, cut the text files up to parcel out for processing via Hadoop or something? And somehow one of those text files got loose somehow...or someone MiTMed the actual process (I'd vote for a floating text file just because it's been so long; the Gawker breach was in December 2010).
my fairly complex alphanumeric+symbol password IS in the dump, though not prepended truncated with 0's and the other one I found, which my coworker admitted was too short and alpha only, was in the dump with prepended 0's.
This could validate the fact that the truncated hashes are actually already cracked.
Whoops.
At the very least, it should have been longer.
I think I have changed to this password during the last year.
(email me if you need proof)
I changed my linkedin password about three weeks ago. The old one is in the list (already 00000-ed), the new one isn't.
Edit: found it in the Slashdot comments, it's: http://www.mediafire.com/?n307hutksjstow3
For the record, my password's hash was not in the list.
mbf041:Downloads shephard$ wc -l SHA1.txt 6143150 SHA1.txt
My password hash which was last rotated July 5, 2011
.,7^R8Cl}g1}Ze6f
Was _not_ found in the file (with/without 00000). I have, of course, changed it today. Strangely enough, the previous password is also not in the list.Need to get better at changing my PWs every three months. It's really not that hard, just a matter of discipline.
Simple line used in OS X terminal:
grep -e "`echo -n "your pass" | openssl sha1`" combo_not.txt
i=`echo -n 'mypass' |openssl sha1 |echo ${i:14}`; grep $i combo_not.txt
This yielded success on some known passwords and a bunch of obvious passwords. Not mine, but I assume this dump is a list of the passwords they've cracked so far (i.e., even if your password isn't on this list - change it).
527688fa9f32bb8dab32d30807ca5c57a0b203b8 is not present
000008fa9f32bb8dab32d30807ca5c57a0b203b8 is present7728240c80b6bfd450849405e8500d6d207783b6 not present
0000040c80b6bfd450849405e8500d6d207783b6 present
or "facebook"
cbe648909034c0624c205fe219d3fbd10052c715 not present
000008909034c0624c205fe219d3fbd10052c715 present
or google
759730a97e4373f3a0ee12805db065e3a4a649a5 not present
000000a97e4373f3a0ee12805db065e3a4a649a5 present
If it is a hoax, it is a very elaborate hoax.
> That's 25 users per hash
Password choices are probably Zipf-distributed, so averages don't make a ton of sense.
The arithmetic mean is specifically the value you'd want. n users times m users/password == total passwords (unduplicated) in the LinkedIn database.
Zipf distribution would suggest that the pattern of reuse among passwords isn't normal, and that the median and mode are probably higher than the arithmetic mean.
from hashlib import sha1
f = "combo_not.txt"
hashes = [x[0:40] for x in open(f)] # [0:40] to stripe off \n
# From another comment
def check_pass(plaintext, offset=5):
hashed = sha1(plaintext).hexdigest()
return (hashed, '0' * offset + hashed[offset:])
print check_pass("linkedin")[0] in hashes # -> False
print check_pass("linkedin")[1] in hashes # -> True (sanity check)
myHash, myHashBroken = check_pass("plaintextoflinkedinpassword")
print myHash in hashes # -> False
print myHashBroken in hashes # -> FalseMine isn't in it.
As you probably guessed from the fact that I posted my old password, I changed it just in case the list that was shared is only a partial list of what was obtained.
E.g. a list of simple password + combinations of the above simple password+"linkedin" variations.
The MtGox hack was in June 2011.
Salting should have been fine.
Mark Burnett's extensive password collection (which he acknowledges is skewed, because it's largely based on cracked passwords, he only harvests passwords between 3 and 30 chars, etc.). Here's how some of his stats shake out:
* Although my list contains about 6 million username/password combos, the list only contains about 1,300,000 unique passwords.
* Of those, approximately 300,000 of those passwords are used by more than one person; about 1,000,000 only appear once (and a good portion of those are obviously generated by a computer).
* The list of the top 20 passwords rarely changes and 1 out of every 50 people uses one of these passwords.
So it's conceivable that 6M unique passwords could cover a very significant portion of a 120M user namespace.
Curious why some of the hashes have been obscured with 00000 but not all. It means more than one possible password could generate the remaining characters, but what does that help or protect?
Are you trying passwords you've used on other sites, or random ones? If it's the former, then LI might not be the only source for the file.
0. This is a file of SHA1 hashes of short strings (i.e. passwords).
1. There are 3,521,180 hashes that begin with 00000. I believe that these represent hashes that the hackers have already broken and they have marked them with 00000 to indicate that fact.
Evidence for this is that the SHA1 hash of 'password' does not appear in the list, but the same hash with the first five characters set to 0 is.
Same story for 'secret': And for 'linkedin': 2. There are 2,936,840 hashes that do not start with 00000 that can be attacked with JtR.3. The implication of #1 is that if checking for your password and you have a simple password then you need to check for the truncated hash.
4. This may well actually be from LinkedIn. Using the partial hashes (above) I find the hashes for passwords linkedin, LinkedIn, L1nked1n, l1nked1n, L1nk3d1n, l1nk3d1n, linkedinsecret, linkedinpassword, ...
5. The file does not contain duplicates. LinkedIn claims a user base of 161m. This file contains 6.4m unique password hashes. That's 25 users per hash. Given the large amount of password reuse and poor password choices it is not improbable that this is the complete password file. Evidence against that thesis is that password of one person that I've asked is not in the list.