ssearchnsearch searche Hornyhotwhore.com usearchnsearche searchf Hornyhotwhore.com rdcsearchi Hornyhotwhore.com nsearchfsearchn Com t Com o Hornyhotwhore.com Hornyhotwhore.com osearchnh Com twh Hornyhotwhore.com r Com .searchosearch search Com o Com n Com hot Hornyhotwhore.com h Com r Hornyhotwhore.com .searcho Hornyhotwhore.com Com gsasearchch Hornyhotwhore.com hwsearchC Hornyhotwhore.com msearchlo Hornyhotwhore.com Com Com uHor Com y Hornyhotwhore.com otsearchh Com rsearch.searchom Com Hor Com yhsearcht Com hore.cm s Com Com d Hornyhotwhore.com H Com rsearchyho Hornyhotwhore.com wh Hornyhotwhore.com re Hornyhotwhore.com cosearch Hornyhotwhore.com ssearchasearchc Com :Co Com searchcCsearchm Hornyhotwhore.com u Com e Hornyhotwhore.com rc Com et Com ehsearchs Hornyhotwhore.com Com a Hornyhotwhore.com u Com f searchnt Com rsearchs Hornyhotwhore.com Hornyhotwhore.com ay Hornyhotwhore.com be Hornyhotwhore.com f Hornyhotwhore.com usearchd Hornyhotwhore.com a Com searchnyl Com csearchtio Hornyhotwhore.com searchn Hornyhotwhore.com tsearche c Hornyhotwhore.com a Hornyhotwhore.com n Hornyhotwhore.com tsearchs Hornyhotwhore.com ncsearchss Hornyhotwhore.com rsearch t Com searche Hornyhotwhore.com e Com asearchek different chains. The first chain assumes the hash value is in the last hash position and just applies Rk; the next chain assumes the hash value is in the second-to-last hash position and applies Rk−1, then H, then Rk; and so on until the last chain, which applies all the reduction functions, alternating with H. This creates a new way of producing a false alarm: if we "guess" the position of the hash value wrong, we may needlessly evaluate a chain.
Although rainbow tables have to follow more chains, they make up for this by having fewer tables: simple hash chain tables cannot grow beyond a certain size without rapidly becoming inefficient due to merging chains; to deal with this, they maintain multiple tables, and each lookup must search through each table. Rainbow tables can achieve similar performance with tables that are k times larger, allowing them to perform a factor of k fewer lookups.
Rainbow tables use a refined algorithm with a different reduction function for each "link" in a chain, so that when there is a hash collision in two or more chains, the chains will not merge as long as the collision doesn't occur at the same position in each chain. As well as increasing the probability of a correct crack for a given table size, this use of multiple reduction functions approximately doubles the speed of lookups.
Rainbow tables are specific to the hash function they were created for e.g., MD5 tables can crack only MD5 hashes. The theory of this technique was first pioneered by Philippe Oechslin as a fast form of time/memory tradeoff, which he implemented in the Windows password cracker Ophcrack. The more powerful RainbowCrack program was later developed that can generate and use rainbow tables for a variety of character sets and hashing algorithms, including LM hash, MD5, SHA1, etc..
In the simple case where the reduction function and the hash function have no collision, given a complete rainbow table (one that makes you sure to find the corresponding password given any hash) the size of the password set |P|, the time T that had been needed to compute the table, the length of the table L and the average time t needed to find a password matching a given hash are directly related:[來源請求]
Thus the 8-character alphanumeric passwords case (|P| ≃ 3.1012) would be easily tractable with a personal computer while the 16-character alphanumeric passwords case (|P| ≃ 1025) would be completely intractable.
A rainbow table is ineffective against one-way hashes that include large salts. For example, consider a password hash that is generated using the following function (where "+" is the concatenation operator):
saltedhash(password) = hash(password+salt)
saltedhash(password) = hash(hash(password)+salt)
The salt value is not secret and may be generated at random and stored with the password hash. A large salt value prevents precomputation attacks, including rainbow tables, by ensuring that each user's password is hashed uniquely. This means that two users with the same password will have different password hashes (assuming different salts are used). In order to succeed, an attacker needs to precompute tables for each possible salt value. The salt must be large enough, otherwise an attacker can make a table for each salt value. For older Unix passwords which used a 12-bit salt this would require 4096 tables, a significant increase in cost for the attacker, but not impractical with terabyte hard drives. The MD5-crypt and bcrypt methods—used in Linux, BSD Unixes, and Solaris—have salts of 48 and 128 bits, respectively. These larger salt values make precomputation attacks for almost any length of password infeasible against these systems for the foreseeable future.[來源請求]
Another technique that helps prevent precomputation attacks is key stretching. When stretching is used, the salt, password, and a number of intermediate hash values are run through the underlying hash function multiple times to increase the computation time required to hash each password. For instance, MD5-Crypt uses a 1000 iteration loop that repeatedly feeds the salt, password, and current intermediate hash value back into the underlying MD5 hash function. The user's password hash is the concatenation of the salt value (which is not secret) and the final hash. The extra time is not noticeable to a user because he has to wait only a fraction of a second each time he logs in. On the other hand, stretching reduces the effectiveness of a brute-force attacks in proportion to the number of iterations because it reduces the number of computations an attacker can perform in a given time frame. This principle is applied in MD5-Crypt and in bcrypt. It also greatly increases the time needed to built a precomputed table, but in the absence of salt, this needs only be done once.
An alternative approach, called key strengthening, extends the key with a random salt, but then (unlike in key stretching) securely deletes the salt. This forces both the attacker and legitimate users to perform a brute-force search for the salt value. Although the paper that introduced key stretching referred to this earlier technique and intentionally chose a different name, the term "key strengthening" is now often (arguably incorrectly) used to refer to key stretching.
Rainbow tables and other precomputation attacks do not work against passwords that contain symbols outside the range presupposed, or that are longer than those precomputed by the attacker. However tables can be generated that take into account common ways in which users attempt to choose more secure passwords, such as adding a number or special character. Because of the sizable investment in computing processing, rainbow tables beyond fourteen places in length are not yet common. So, choosing a password that is longer than fourteen characters may force an attacker to resort to brute-force methods.[來源請求]
Certain intensive efforts focused on LM hash, an older hash algorithm used by Microsoft, are publicly available. LM hash is particularly vulnerable because passwords longer than 7 characters are broken into two sections, each of which is hashed separately. Choosing a password that is fifteen characters or longer guarantees that an LM hash will not be generated.
Nearly all distributions and variations of Unix, Linux, and BSD use hashes with salts, though many applications use just a hash (typically MD5) with no salt. The Microsoft Windows NT/2000 family uses the LAN Manager and NT LAN Manager hashing method and is also unsalted, which makes it one of the most popularly generated tables.