Mediawiki/Anonymous IP Hash: Difference between revisions

From Bibliotheca Anonoma
No edit summary
No edit summary
Line 8: Line 8:


Here's the gist of my anon ID hack to MediaWiki. I can't really package it as an extension or anything because it involves hacking things that
Here's the gist of my anon ID hack to MediaWiki. I can't really package it as an extension or anything because it involves hacking things that
apparently aren't supposed to be hacked, but it's not hard to do. - Halcy <!-- Note that this mod makes banning edits quite hard. Maybe if there was a way to just not show the IP address to non-Admin users, and still store the IP in the database, that would be better. But on the flip side, tanasinn.info seems to be doing fine with it. -->
apparently aren't supposed to be hacked, but it's not hard to do. - Halcy <!-- Note that this mod makes banning IPs quite hard. Maybe if there was a way to just not show the IP address to non-Admin users, and still store the IP in the database, that would be better. But on the flip side, tanasinn.info seems to be doing fine with it. -->


1. Add the following to your LocalSettings.php:
1. Add the following to your LocalSettings.php:
Line 17: Line 17:
$wgDisableAnonTalk = true;
$wgDisableAnonTalk = true;
function AnonUsername($IP) {
function AnonUsername($IP) {
         // Expiry time for hashes: dmY = new ID per day, WY = per week.
    $options = [
        $key = $IP.'PUT RANDOM TEXT HERE'.gmdate('dmY');
         'cost' => 12, // bcrypt computation cost is 12 instead of default 10
        return 'ID:'.substr(password_hash($key, PASSWORD_DEFAULT), 'id'), 8, 8); // uses bcrypt level 10
    ];
 
    // Expiry time for hashes: dmY = new ID per day, WY = per week.
    $key = $IP.'PUT RANDOM TEXT HERE'.gmdate('dmY'); // for bcrypt, the key string can only be 72 characters, so the RANDOM TEXT salt should be 49 characters (72 - 16 - 8)
    return 'ID:'.substr(password_hash($key, PASSWORD_BCRYPT, $options), 'id'), 8, 8); // uses bcrypt level 10
}
}
</pre>
</pre>


The ID is a truncated hash, which, although it increases the risk of collisions, that may be a benefit rather than a liability when it comes to IPs. http://www.perlmonks.org/?node_id=111524
The ID is a truncated hash, which, although it increases the risk of collisions, [http://www.perlmonks.org/?node_id=111524 that may be a benefit rather than a liability when it comes to IPs.]


{{Warning|Beware that hashing is [https://www.phillips321.co.uk/2012/04/04/cracking-an-md5-of-an-ip-address/ not a completely safe way to protect IPs], but if you use a good salt and bcrypt it can stop attackers for a few years.}}
{{Note|Obviously you'd change the "PUT RANDOM TEXT HERE" to some random text: this functions as the salt and reduces the risk of brute force attacks. Just bang on the keyboard for a bit, or if you want to be truly random, get an RNG or just roll some dice. Make sure it is up to 49 characters, [http://php.net/manual/en/function.password-hash.php since the max size of a string for bcrypt is 72 characters.]}}


{{Note|Obviously you'd change the "PUT RANDOM TEXT HERE" to some random text: this functions as the salt and reduces the risk of brute force attacks. Just bang on the keyboard for a bit, or if you want to be truly random, get an RNG or just roll some dice.}}
{{Warning|While it is certainly miles better than bare IP addresses, hashing is [https://www.phillips321.co.uk/2012/04/04/cracking-an-md5-of-an-ip-address/ not an absolutely safe way to protect IPs]. We use bcrypt and a good salt, so it can stop attackers for quite a long time: but not forever. Maybe 5-10 years or so.}}


2. In <code>includes/user/User.php</code>, (Mediawiki 1.27.1: getName() Line 2109) find the line that says:
2. In <code>includes/user/User.php</code>, (Mediawiki 1.27.1: getName() Line 2109) find the line that says:

Revision as of 20:41, 9 December 2016

By default, MediaWiki displays IP Addresses of an anonymous editor in edit history. This obviously has a chilling effect on anonymous user participation.

However, this wiki hashes these IP addresses using a salted bcrypt function, and displays the first 8 characters as an anonymous ID (e.g. ID:D9erK127). The IDs change daily.

These are inspired by 2channel's anonymous ID hashes, as seen periodically on 4chan's /b/.

Activating Anonymous IP Hash

Here's the gist of my anon ID hack to MediaWiki. I can't really package it as an extension or anything because it involves hacking things that apparently aren't supposed to be hacked, but it's not hard to do. - Halcy

1. Add the following to your LocalSettings.php:

// you can leave anon talk pages on, but you'll
// likely end up with useless crud after IDs expire
$wgDisableAnonTalk = true;
function AnonUsername($IP) {
    $options = [
        'cost' => 12, // bcrypt computation cost is 12 instead of default 10
    ];

    // Expiry time for hashes: dmY = new ID per day, WY = per week.
    $key = $IP.'PUT RANDOM TEXT HERE'.gmdate('dmY'); // for bcrypt, the key string can only be 72 characters, so the RANDOM TEXT salt should be 49 characters (72 - 16 - 8)
    return 'ID:'.substr(password_hash($key, PASSWORD_BCRYPT, $options), 'id'), 8, 8); // uses bcrypt level 10
}

The ID is a truncated hash, which, although it increases the risk of collisions, that may be a benefit rather than a liability when it comes to IPs.

Note: Obviously you'd change the "PUT RANDOM TEXT HERE" to some random text: this functions as the salt and reduces the risk of brute force attacks. Just bang on the keyboard for a bit, or if you want to be truly random, get an RNG or just roll some dice. Make sure it is up to 49 characters, since the max size of a string for bcrypt is 72 characters.
Warning: While it is certainly miles better than bare IP addresses, hashing is not an absolutely safe way to protect IPs. We use bcrypt and a good salt, so it can stop attackers for quite a long time: but not forever. Maybe 5-10 years or so.

2. In includes/user/User.php, (Mediawiki 1.27.1: getName() Line 2109) find the line that says:

   $this->mName = IP::sanitizeIP( $this->getRequest()->getIP() );

and change it to:

   $this->mName = AnonUsername( $this->getRequest()->getIP() );

3. In includes/user/User.php, (Mediawiki 1.27.1: getBlockedStatus() Line 1600) find the line that says:

   : IP::sanitizeIP( $wgUser->getRequest()->getIP() );

and change it to:

   : AnonUsername( $this->getRequest()->getIP() );

You will need to repeat this mod whenever you update MediaWiki, since obviously an update replaces the system files. And of course the lines may vary, but have generally been similar.

aa tags

On a slightly related note, I hacked an extension together for <aa> tags.

  • Music:DQN-kun / >>6 is not a panda

http://storlek.livejournal.com/47939.html?thread=47171