- 1,976
- 68
- 220
Доброго времени суток о/
Столкнулся с такой фигнёй, что на сервере на Термосе хеш-функции не работают как собственно хеш-функции (на одинаковый вход одинаковый выход)
Собственно, выдаю себе три одинаковых предмета из NEI, жму на каждом ПКМ, вызывая хеш от связки ника и названия предмета, а дальше происходит веселье:
На клиенте хеш работает правильно. А на сервере совсем нет (проверено на названиях без спецсимволов - тоже самое)
Проверил в сингле - работает.
Проверил на ванильном сервере - всё окей.
Клиент-сайд на сервере с термосом проходит (что логично), а вот сам сервер - нет.
Подскажите, пожалуйста, в чём может быть лажа и как эту лажу фиксить?
Заранее спасибо
Столкнулся с такой фигнёй, что на сервере на Термосе хеш-функции не работают как собственно хеш-функции (на одинаковый вход одинаковый выход)
Собственно, выдаю себе три одинаковых предмета из NEI, жму на каждом ПКМ, вызывая хеш от связки ника и названия предмета, а дальше происходит веселье:
На клиенте хеш работает правильно. А на сервере совсем нет (проверено на названиях без спецсимволов - тоже самое)
Да-да, внаглую спижжен позаимствован из Ботании.
Java:
{
// ...
merge(player.getCommandSenderName(), stack.getDisplayName()) // ...
// ...
}
String merge(String s1, String s2) {
String s = "";
for (int i = 0; i < s1.length(); i++) for (int j = 0; j < s2.length(); j++) s += (char) ((s1.charAt(i) * s2.charAt(j)) % 256);
return hash(s);
}
String hash(String str) {
if(str != null)
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
return new HexBinaryAdapter().marshal(md.digest(salt(str).getBytes(Charset.forName("UTF-8"))));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
// Might as well be called sugar given it's not secure at all :D
String salt(String str) {
str = str += "wellithoughtthatthisiscoolideaandicanmakesomethinglikethis#whynot";
SecureRandom rand = new SecureRandom(str.getBytes(Charset.forName("UTF-8")));
int l = str.length();
int steps = rand.nextInt(l);
char[] chrs = str.toCharArray();
for(int i = 0; i < steps; i++) {
int indA = rand.nextInt(l);
int indB;
do {
indB = rand.nextInt(l);
} while(indB == indA);
char c = (char) (chrs[indA] ^ chrs[indB]);
chrs[indA] = c;
}
return String.copyValueOf(chrs);
}
Проверил на ванильном сервере - всё окей.
Клиент-сайд на сервере с термосом проходит (что логично), а вот сам сервер - нет.
Подскажите, пожалуйста, в чём может быть лажа и как эту лажу фиксить?
Заранее спасибо