Ruby - дайджест-аутентификация для мыльных и байтовых массивов - PullRequest
1 голос
/ 27 марта 2012

Как преобразовать строку или значение в байтовый массив? Мне это нужно для аутентификации SOAP. Мое требование - На стороне клиента это как создать дайджест: 1. Дайджест-массив на стороне клиента = байтовый массив nonce + байтовый массив UTC дата-время строки UTF-8 + байтовый массив UTF-8 простой текстовый пароль (объединить эти три). 2. Дайджест SHA-1 на стороне клиента = хэш с алгоритмом SHA-1 - массив дайджеста на стороне клиента. 3. Дайджест WS-Security на стороне клиента = 64-битное кодирование Дайджест SHA-1 на стороне клиента

Password_Digest = Base64 (SHA-1 (nonce + метка времени + пароль))

Это код, который я использую для генерации nonce, timestamp и digest_password. Пароль пользователя - это строка. Некоторый тинг неправильный во всем процессе, и мой дайджест не был успешно сгенерирован. Я думаю, что у меня есть эти типы данных правильно, байтовый массив и UTF8 меня смущает. Я добавил преобразование utf8, но без разницы.

def nonce
   chars = ("a".."z").to_a + ("1".."9").to_a + ("A".."Z").to_a
   @nonce = Array.new(20, '').collect{chars[rand(chars.size)]}.join
end

def timestamp
    t = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%S.%LZ")
    @timestamp = t.to_s
end

def digest_password

ic = Iconv.new('UTF-8//IGNORE', 'US-ASCII')
$time =  ic.iconv( timestamp + ' ')[0..-2]
$pass =  ic.iconv( password + ' ')[0..-2]
temp = (nonce.bytes.to_a + $time.bytes.to_a + $pass.bytes.to_a)
@digest_password = Base64.strict_encode64(Digest::SHA1.hexdigest(temp.to_s))

###  temp =  Digest::SHA1.hexdigest(nonce + timestamp + password) ##old    
###@digest_password = Base64.encode64(temp) ##old

end


    <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://xml.myserver.com/ok/service/v1_5" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Header>
       <wsse:Security env:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
       <wsse:UsernameToken wsu:Id="UsernameToken-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>user</wsse:Username>
       <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">YWIwM2QyZWI3YTEwMTAzZmNkNmZiNmEwMjg1ODlkOTU0OTNmNmUxYQ==
       </wsse:Password> 
       <wsse:Nonce>ZEUyQ2J6bmw5cjdDZmt1QjVqTjQ=</wsse:Nonce>
       <wsu:Created>2012-03-27T11:08:35.125Z</wsu:Created>
</wsse:UsernameToken>

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Наконец-то удалось решить эту проблему.

Password_Digest = Base64 ( SHA-1 ( nonce + create + password) )

nonce = nonce как строка.До Endoce Base64, например, "1234"

create = время в виде строки.Без кодировки

password = пароль в виде строки.Нет кодирования.

Base64Nonce = Base64.encode64(nonce).strip # Base64 кодирует "1234"

chars = ("a".."z").to_a + ("1".."9").to_a + ("A".."Z").to_a
nonce = Array.new(20, '').collect{chars[rand(chars.size)]}.join

t = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%S.%LZ")

$time = t
$pass = p
Base64Nonce = Base64.encode64(nonce).strip 

$digest_pass = Base64.encode64(Digest::SHA1.digest(nonce + $time + $pass)).strip



          "wsse:Username" => username,
          "wsse:Password" => $digest_pass,
          "wsse:Nonce" => Base64Nonce,
          "wsu:Created" => $time,
0 голосов
/ 27 марта 2012

Правильно ли Base64.encode в методе nonce, а затем Base64.encode снова в методе digest_password?Кажется странным для меняМожет быть, вы должны сделать

def nonce
   chars = ("a".."z").to_a + ("1".."9").to_a + ("A".."Z").to_a
   @nonce = Array.new(20, '').collect{chars[rand(chars.size)]}.join
end
...