Я работаю над плагином Bukkit (Minecraft Server-side). Плагин позволяет игрокам отправлять сообщения друг другу взад и вперед. Я также работаю над веб-интерфейсом. Чтобы просмотреть их «входящие», они должны сначала войти с паролем, который может установить в игре.
Этот пароль не хранится в сыром виде, он преобразуется в длинную строку значений юникода, затем разбивается на куски, каждый из которых преобразуется в шестнадцатеричный и добавляется в другую строку.
//This isn't the best method, I know, but it's still going to take a genius to crack it. //The resulting number (before somewhat converted to hex) is really //long, there isn't an easy way of knowing the sequence of characters. //This conversion is much different than straight up converting to hex, //as PHP has certain limitations public static String encodePassword(String password) { String longNumber = ""; for(int i = 0; i < password.length(); i++) { longNumber += ((int) password.charAt(i)); } //System.out.println("long = " + longNumber); String result = ""; int splitLength = 5; int iterations = longNumber.length() / splitLength; if(longNumber.length() % splitLength > 0) iterations++; for(int i = 0; i < iterations; i++) { //System.out.println(result); int start = splitLength * i; if(longNumber.length() - start <= splitLength) { String sub = longNumber.substring(start); result += Integer.toHexString(Integer.parseInt(sub)); continue; } String sub = longNumber.substring(start, start + splitLength); result += Integer.toHexString(Integer.parseInt(sub)); } return result; }
function encodePassword($pw){ $unicode = ""; for($i=0; $i<strlen($pw); $i++){ $char = $pw{$i}; $val = unicode_value($char); $unicode = $unicode.$val; } $result = ""; $splitLength = 5; $iterations = strlen($unicode) / $splitLength; if(strlen($unicode) % $splitLength > 0) $iterations++; for($i = 0; $i < $iterations; $i++) { $start = $splitLength * $i; if(strlen($unicode) - $start <= $splitLength) { $sub = substr($unicode, $start); $result = $result.base_convert($sub, 10, 16); continue; } $sub = substr($unicode, $start, $splitLength); $result = $result.base_convert($sub, 10, 16); } return $result; }
Если я «закодирую» пароль «partychat» (имя плагина, у него также есть функция группового чата), я получаю 2c212c93ef23163a91bcc
в Java и 2c212c93ef23163a91bcc0
(то же, что и для трейлинга 0) в PHP. Все, что я делаю неправильно?
Примечание. Это не всегда происходит, большинство «кодировок» отлично работают, но по какой-то причине это случается иногда
Почему вы даже этого хотите, я просто использовал бы хэш-адрес userpassword, например: Этот вопрос stackoverflow о SHA-256 , я знаю, что он не решает вашу проблему, но гораздо безопаснее не изобретать свой собственный encryptionstandard 🙂