2012-03-27 41 views
1

我如何转换字符串的值或字节数组? 我需要它SOAP验证。我的要求是 - 在客户端,这是如何创建一个摘要: 1.客户端摘要数组=字节数组nonce +字节数组UTF-8的UTC日期时间字符串+字节数组UTF-8纯文本密码(连接这三个)。 2.客户端的SHA-1摘要=散列与SHA-1算法客户端文摘阵列。 3.客户端的WS-Security文摘= 64位进行编码在客户端SHA-1摘要红宝石 - 肥皂和字节数组摘要式身份验证

Password_Digest = Base64的(SHA-1(随机数+时间戳+密码))

这是我的代码用于生成随机数,时间戳和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> 

回答

1

终于能够解决这个问题。

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

nonce =随机数作为字符串。在Base64 endoce之前,例如“1234”

create =时间为字符串。无编码

password =密码为字符串。没有编码。

Base64Nonce = Base64.encode64(nonce).strip “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

为了有一个更简单的方法时间:'需要“时间”; Time.now.utc.iso8601(3)' – Jeff 2014-07-05 16:23:47

0

是正确的在nonce方法Base64.encode,然后再Base64.encodedigest_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 
+0

Padde,排名的Base64编码修正了,但并没有区别。 – 2012-03-27 18:38:02