Generate 32 Byte Key Php
PHP provides the popular md5() hash function out of the box, which returns 32 a hex character string. It’s a great way to generate a fingerprint for any arbitrary length string. But what if you need to generate an integer fingerprint out of a URL?
Challenge
A strong AES key will be 16, 24, or 32 bytes long. If you restrict the key to bytes that map to printable US-ASCII characters, the key will be weaker than expected, because its range is limited (to about 100 bits, rather than 128—many millions of times weaker). PHP extension is wrapping ed25519, an Elliptic Curve Digital Signature Algortithm, developed by Dan Bernstein, Niels Duif, Tanja Lange, Peter Schwabe, and Bo-Yin Yang. encedo/php-ed25519-ext.
# A secret key has no structure. It's nothing more than N bytes of data. # It should typically be random data, or bytes that resemble random data such # as the hash of a password. # The number of bytes in the secret key defines the bit-strength of an encryption # algorithm. For example, AES with a 32-byte key. Update (12/2015): For PHP 7.0, you should use randomint instead of mtrand as it provides 'cryptographically secure values'. Personally, I like to use sha1(microtime(true).mtrand(0)) but you are looking for more of a customizable approach, so try this function (which is a modification to your request of this answer). Finally, bitaddress uses accumulated entropy to generate a private key. It needs to generate 32 bytes. For this task, bitaddress uses an RNG algorithm called ARC4. The program initializes ARC4 with the current time and collected entropy, then gets bytes one by one 32 times.
We faced that challenge in RatingWidget when we had to bind our rating widgets to a unique Int64 IDs based on the website’s page it’s being loaded from. Theoretically we could just store the URLs and query the URL column, but URLs can be very long and creating an index for text column with unknown length is very inefficient.
So if you are working on any kind of dynamic widget development that should load different data based on the URL it’s loaded from, this post will save you tonnes of time.
To simplify the problem, let’s divide it into two sub-challenges:
- URL Canonization
- String to unique Int64 conversion
URL Canonization
In our case, we wanted to assign a unique Int64 for a page, not for a URL. For instance, http://domain.com?x=1&y=2
and http://domain.com?y=2&x=1
are different URLs but in fact both of them will load the exact same page. Therefore, we wanted to assign them an identical Int64 ID. Thus, by canonizing the URLs before mapping them to Int64, we can convert the URLs to uniform representation.
Basically what this code does is reorder the query string parameters by lexicographical order, and slightly tweak the URL encoding based on RFC 3986 URI syntax standard, to compensate for the different browsers + server URL encoding inconsistency.
Notes:
- In our case canonizeUrl, the canonization function, gets rid of the protocol. So
https://domain.com
andhttp://domain.com
are both canonized todomain.com
because we wanted to show the same rating widget on HTTP and HTTPS equivalent pages. - As you can notice, we also ignore everything the after hashmark fragment. Therefore, if you would like to generate unique IDs for SPA (Single Page Application) different states like
http://my-spa.com/#state1
andhttp://my-spa.com/#state2
, the URL canonization function has to be modified to support that.
Converting String to unique Int64 ID for MySql BIGINT Indexed Column
After fooling around with various bit conversion functions like bindec()
, decbin()
, base_convert()
. We have found out that 64 bit integers and PHP are not playing well. None of the mentioned functions consistently supports 64 bit. After digging around on Google, we were lead to a post about 32 bit limitations in PHP which included the suggestion to use GMP, a really cool library for multiple precision integers. Using this library, we managed to create this one line hash function that generates a 64 bit integer out of arbitrary length string.
Post factum, we could have implemented the CRC64 algorithm which generates a string checksum and should perform faster than MD5. But the advantage of the technique we’ve used over CRC is that we’ve created a one-way-hash function, so we can reuse it for various cryptography purposes in the code.
We present to you the new and updated The SIMS 3 Free CD Key Generator. We decide to create this The SIMS 3 Keygen to help fellow gamers to get a license key and play game for free. Sims 3 base game key generator 2017.
To find out more about GMP, see here.
Grand Finale
Combining the URL canonization with the String to Int64 mapping, the final solution looks like this:
Collision and Performance Test of get64BitHash
Platform: Intel i3, Windows 7 64 bit, PHP 5.3
Iterations: 10,000,000 Times generated get64BitHash
Elapsed Time: 460 millisecond for every 100,000 generations
Collision: Not found
Summary
Generate 32 Byte Key Php Code
Generate 32 Byte Key Php Software
I hope this straightforward solution will save you time on your next project. If you have comments or any additional use-cases where this technique can be applied, please feel free to comment below.