2012-07-13 4 views
1

OAuth 1.0을 사용하는 서비스에 대해 몇 가지 설명 선을 만들어야하며 각 요청에 HMAC-SHA1으로 서명해야합니다.SalesForce에서 Crypto.generateMac() 문제 APEX

서비스에 APEX 클라이언트 API가 없습니다. 따라서 우리는 수동으로해야합니다. 불행하게도

,

EncodingUtil.base64Encode(Crypto.generateMac('hmacSHA1', Blob.valueOf(data), Blob.valueOf(key))); 

는 우리가 기대하는 것과 다른 문자열을 반환합니다. 동일한 입력에 대한 출력을 다른 언어의 라이브러리와 비교했습니다. 그리고 결과는 달랐습니다.

+0

어떻게 다른 점이 있습니까? 예를 들어 base64와 16 진수 인코딩을 어떻게 다르게 할 수 있습니까? – superfell

+0

당신이보고있는 것의 예를 제공한다면 그것은 분명히 도움이 될 것입니다 : 입력과 두 개의 다른 출력. 나는 꽤 긴 시간 동안 Apex를 통해 HmacSHA256 서명을 사용해 왔습니다. – jkraybill

답변

2

OAuth 1.0을 호출하는 데 문제가 없습니다. 이 도달 될 수

private Map<String,String> getUrlParams(String value) 
{ 
    Map<String,String> res = new Map<String,String>(); 
    if(value==null || value=='') 
    { 
     return res; 
    } 
    for(String s : value.split('&')) 
    { 
     List<String> kv = s.split('='); 
     if(kv.size()>1) 
     { 
      res.put(kv[0],kv[1]); 
     } 
    } 
    return res; 
} 

private String createBaseString(Map<String,String> oauthParams, HttpRequest req) 
{ 
    Map<String,String> p = oauthParams.clone(); 
    if(req.getMethod().equalsIgnoreCase('post') && req.getBody()!=null && req.getHeader('Content-Type')=='application/x-www-form-urlencoded') 
     p.putAll(getUrlParams(req.getBody())); 
    String host = req.getEndpoint(); 
    Integer n = host.indexOf('?'); 
    if(n > -1) 
    { 
     p.putAll(getUrlParams(host.substring(n+1))); 
     host = host.substring(0,n); 
    } 
    List<String> keys = new List<String>(); 
    keys.addAll(p.keySet()); 
    keys.sort(); 
    String s = keys.get(0)+'='+p.get(keys.get(0)); 
    for(Integer i=1; i<keys.size(); i++) 
     s = s + '&' + keys.get(i) + '=' + p.get(keys.get(i)); 

    return req.getMethod().toUpperCase() + '&' + EncodingUtil.urlEncode(host, 'UTF-8') + '&' + EncodingUtil.urlEncode(s, 'UTF-8'); 
} 

public void sign(HttpRequest req) 
{ 
    nonce = String.valueOf(Crypto.getRandomLong()); 
    timestamp = String.valueOf(DateTime.now().getTime()/1000); 

    refreshParameters(); 

    String s = createBaseString(parameters, req); 
    Blob sig = Crypto.generateMac('HmacSHA1', Blob.valueOf(s), 
     Blob.valueOf(consumerSecret+'&'+ (tokenSecret!=null ? tokenSecret : ''))); 

    signature = EncodingUtil.urlEncode(EncodingUtil.base64encode(sig), 'UTF-8'); 

    String header = 'OAuth '; 
    for (String key : parameters.keySet()) 
    { 
     header = header + key + '="'+parameters.get(key)+'", '; 
    } 
    header = header + 'oauth_signature="'+signature+'"'; 
    req.setHeader('Authorization',header); 
} 

추가 코드를 추가하지만, 대소 문자 구분 문제가있을 수 있습니다 :

편집 : 여기에 몇 가지 샘플 에이펙스는 귀하의 요청에 서명입니까? 알림 'HmacSHA1'이 아니라 'HmacSHA1'이라고 부릅니다.

+0

안녕하세요 @ 아담, 이건 좋은데,이 generatemac을 사용하여 암호화하려고합니다. 우리는 어떻게 우리 자신의 개인 키를 사용하여 암호를 해독합니까 ??? 샘플 코드를 게시 할 수 있습니까? – Sathya

+0

아담 전체 코드를 넣어주세요 –

+0

추가 코드가 게시되었습니다. – Adam

관련 문제