2015-08-12 2 views
3

У нас есть устаревший API-интерфейс NodeJS, с которого мы стремимся уйти. Мы извлекаем из него аут-компонент.Шифрование и двоичное кодирование NodeJS по умолчанию

У нас есть функция, которая хэширует пароль, который выглядит немного как:

var sha256 = crypto.createHash('sha256'); 
sha256.update(password + secret); 
return sha256.digest('hex'); 

Помимо очевидных последствий безопасности функции, как это, это закодированные с помощью двоичного кодирования NodeJS имеет.

Если вы передадите строку для обновления, она будет использовать 'binary' в качестве формата кодирования. Это приводит к тому, что он фактически кодирует символы Unicode, такие как «Kiełbasa», как «KieBbasa», перед тем, как SHA256 «их».

В нашем коде Scala мы теперь переписываем эту устаревшую функцию, чтобы мы могли использовать старых пользователей. Но мы не можем найти кодировку для использования в этих строках, которая имеет тот же результат. Наш код Scala выглядит следующим образом:

def encryptPassword(password: String): String = { 
    Hashing.sha256().hashString(in, Charsets.UTF_8).toString 
} 

Нам нужно in строку, чтобы быть таким же, как то, что использует узел, но мы не можем понять это.

Идеи? Node.js ... даже не один раз.

+0

ли вы что '' 'Hashing.sha256()' '' самостоятельно или это часть библиотеки? Если есть что-то вроде метода '' '' hashBytes (in: Array [Byte]) '' ', я думаю, вы могли бы сделать что-то вроде' '' Hashing.sha256(). HashBytes (password.getBytes) .toString''', чтобы вы можете сделать один-к-одному порт исходной функции Node.js. Будет ли это работать для вас? – stefanobaghino

+0

Хешинг является частью Гуавы. Я пробовал код, который вы предлагали, но это не хорошо. Выходные байты не совпадают. Они делаются в случаях, когда нет символов Unicode –

+0

Хорошо, я попытался немного поэкспериментировать с кодировками, а '' 'ł''' переводится в' '' '' '' 'при форсировании его кодировки' '' 'UTF-16LE '' ', а затем вернуться к' '' UTF-8'''. Ты это пробовал? – stefanobaghino

ответ

1

Ну, оказывается, это намного проще, чем кажется. Следующий код работает:

def encryptPassword(password: String): String = { 
    val in = (password + secret).map(_.toByte.toChar).mkString("") 
    Hashing.sha256().hashString(in, Charsets.UTF_8).toString 
} 

Благодаря @stefanobaghino