Ruby sha512 восстановление пароля в php - PullRequest
1 голос
/ 06 апреля 2011

(Обновлено из-за некоторой путаницы в моем вопросе). Мы используем этот метод для генерации digested_password, который сохраняется в нашей базе данных для последующего поиска. Когда мы аутентифицируем пользователя в нашем приложении, этот метод снова запускается для его ввода, и если вывод digested_password совпадает с сохраненным в базе данных digested_password, мы аутентифицируем его. Мне нужно воспроизвести эту функцию на PHP для другого приложения, которое совместно использует базу данных.

def self.hash_password( password, salt )
  salted_password = password.insert 4, salt
  digested_password = Digest::SHA512.hexdigest("#{salted_password}")
  return digested_password
end

У меня действительно нет опыта работы с Ruby, поэтому, пожалуйста, прости меня за отсутствие понимания.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011

Поскольку вы не можете «извлечь» пароль из одностороннего хеша, такого как SHA-512, самое близкое, что мы можем получить, - это возможность сгенерировать тот же хеш из того же пароля и соли.Давайте посмотрим на код Ruby:

def self.hash_password( password, salt )
  salted_password = password.insert 4, salt
  digested_password = Digest::SHA512.hexdigest("#{salted_password}")
  return digested_password
end

Единственное, что немного "странно", это вызов метода .insert в строке пароля.По сути, это соль в пароль, начиная с четвертого символа индекса.Обычно соли просто объединяются с паролем.

Мы можем повторить это, используя substr:

function hash_password($password, $salt) {
    $salted_password = substr($password, 0, 4) . $salt . substr($password, 4);
    return hash('sha512', $salted_password);
}

Я использую теперь используемый по умолчанию здесь расширение хеша , так как это в значительной степени самый надежный способ создания хеша SHA-512.

Используя этот код, вы должны иметь возможность генерировать идентичные хеш-коды для заданного идентичного пароля и комбинации символов.Я не уверен, что будет, если пароль будет длиной менее пяти символов.


Да, похоже, он должен работать:

[charles@lobotomy ~]$ irb
irb(main):001:0> require 'digest/sha2'
=> true
irb(main):002:0> def hash_password( password, salt )
irb(main):003:1>   salted_password = password.insert 4, salt
irb(main):004:1>   digested_password = Digest::SHA512.hexdigest("#{salted_password}")
irb(main):005:1>   return digested_password
irb(main):006:1> end
=> nil
irb(main):007:0* puts hash_password('password', 'salt')
92d3efdbf51d199b0930c427b77dc8d5cf41ac58b6fab5f89cc3f32d719a8f6ffcdff6211bdd0565a6e7b09925839e5dcce1fa5abf65eca87c6a883ab0b510b9
=> nil
irb(main):018:0> exit
[charles@lobotomy ~]$ 
[charles@lobotomy ~]$ php -a
Interactive shell

php > function hash_password($password, $salt) {
php {     $salted_password = substr($password, 0, 4) . $salt . substr($password, 4);
php {     return hash('sha512', $salted_password);
php { }
php > echo hash_password('password', 'salt');
92d3efdbf51d199b0930c427b77dc8d5cf41ac58b6fab5f89cc3f32d719a8f6ffcdff6211bdd0565a6e7b09925839e5dcce1fa5abf65eca87c6a883ab0b510b9
php >
2 голосов
/ 06 апреля 2011
function hash_password($password, $salt)
{
  $salted_password = substr_replace($password, $salt, 4, 0);
  $digested_password = hash('sha512', $salted_password);
  return $digested_password;
}
1 голос
/ 06 апреля 2011

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

0 голосов
/ 06 апреля 2011

Я понял это.Я не совсем понял метод вставки в Ruby, и оказалось, что соль вставляется в пароль на четвертом символе.Вот эквивалент PHP:

$password_input = "derpaderp";
$password_salt = "aderp";
$arg=substr_replace($password_input, $password_salt, 4, 0);
$pass = hash('sha512', $arg);
if ( $digested_password_from_database == $pass ){ echo "success!"; }

Спасибо за ваши ответы, ребята.

...