WEB开发网
开发学院软件开发Java 用 Kerberos 为 J2ME 应用程序上锁,第 3 部分: 建... 阅读

用 Kerberos 为 J2ME 应用程序上锁,第 3 部分: 建立与电子银行的安全通信(上)

 2010-03-30 00:00:00 来源:WEB开发网   
核心提示: 向 KDC 服务器发送 TGT 请求设置了 KDC 服务器后,就向它发送 TGT 请求,用 Kerberos 为 J2ME 应用程序上锁,第 3 部分: 建立与电子银行的安全通信(上)(2),看一下 清单 1 中的 getTicketResponse() 方法,它与 本系列第二篇文章中的清单 1

向 KDC 服务器发送 TGT 请求

设置了 KDC 服务器后,就向它发送 TGT 请求。看一下 清单 1 中的 getTicketResponse() 方法。它与 本系列第二篇文章中的清单 12 中的 getTicketResponse() 方法是相同的,只有一处不同:这个方法现在包括向 KDC 服务器发送 TGT 请求的 J2ME 代码。在 清单 1中标出了新的代码,所以您可以观察在 清单 12中没有的新增代码。

在 清单 1 的 NEW CODE 部分中,我以一个现有的 DatagramConnection 对象( dc )为基础创建了一个新的 Datagram 对象( dg )。注意在本文的最后一节中,移动银行 MIDlet 创建了我在这里用来创建 Datagram 对象的 dc 对象。

创建了 dg 对象后, getTicketResponse() 方法调用了它的 send() 方法,向 KDC 服务器发送票据请求。

在向服务器发送了 TGT 请求之后, 清单 1 的 getTicketResponse() 方法接收服务器的 TGT 响应。收到响应后,它将响应返回给调用应用程序。

清单 1. getTicketResponse() 方法

  public byte[] getTicketResponse( ) 
  { 
    byte ticketRequest[]; 
    byte msg_type[]; 
    byte pvno[] = getTagAndLengthBytes(ASN1DataTypes.CONTEXT_SPECIFIC, 
            1, getIntegerBytes(5)); 
    msg_type = getTagAndLengthBytes(ASN1DataTypes.CONTEXT_SPECIFIC, 
             2, getIntegerBytes(10)); 
    byte kdc_options[] = getTagAndLengthBytes(ASN1DataTypes.CONTEXT_SPECIFIC, 
                 0, getBitStringBytes(new byte[5])); 
    byte generalStringSequence[] = getSequenceBytes ( 
                     getGeneralStringBytes (userName)); 
    byte name_string[] = getTagAndLengthBytes(ASN1DataTypes.CONTEXT_SPECIFIC, 
               1, generalStringSequence); 
    byte name_type[] = getTagAndLengthBytes(ASN1DataTypes.CONTEXT_SPECIFIC, 
               0, getIntegerBytes(ASN1DataTypes.NT_PRINCIPAL)); 
    byte principalNameSequence [] = getSequenceBytes( 
                  concatenateBytes (name_type, name_string)); 
    byte cname[] = getTagAndLengthBytes (ASN1DataTypes.CONTEXT_SPECIFIC, 
             1, principalNameSequence); 
    byte realm[] = getTagAndLengthBytes (ASN1DataTypes.CONTEXT_SPECIFIC, 
             2, getGeneralStringBytes (realmName)); 
    byte sgeneralStringSequence[] = 
        concatenateBytes(getGeneralStringBytes(kdcServiceName), 
                 getGeneralStringBytes (realmName)); 
    byte sname_string[] = getTagAndLengthBytes(ASN1DataTypes.CONTEXT_SPECIFIC, 
                1, getSequenceBytes(sgeneralStringSequence)); 
    byte sname_type[] = getTagAndLengthBytes(ASN1DataTypes.CONTEXT_SPECIFIC, 
               0, getIntegerBytes(ASN1DataTypes.NT_UNKNOWN)); 
    byte sprincipalNameSequence [] = getSequenceBytes 
                    (concatenateBytes (sname_type, sname_string)); 
    byte sname[] = getTagAndLengthBytes (ASN1DataTypes.CONTEXT_SPECIFIC, 
             3, sprincipalNameSequence); 
    byte till[] = getTagAndLengthBytes ( 
            ASN1DataTypes.CONTEXT_SPECIFIC, 
            5, 
            getGeneralizedTimeBytes ( 
                new String("19700101000000Z").getBytes())); 
    byte nonce[] = getTagAndLengthBytes( 
                ASN1DataTypes.CONTEXT_SPECIFIC, 
                7, 
                getIntegerBytes (getRandomNumber())); 
    byte etype[] = getTagAndLengthBytes( 
                ASN1DataTypes.CONTEXT_SPECIFIC, 
                8, 
                getSequenceBytes(getIntegerBytes(3))); 
    byte req_body[] = getTagAndLengthBytes( 
               ASN1DataTypes.CONTEXT_SPECIFIC, 
               4, 
               getSequenceBytes( 
                concatenateBytes( 
                  kdc_options, 
                  concatenateBytes( 
                   cname, 
                     concatenateBytes( 
                      realm, 
                      concatenateBytes( 
                        sname, 
                        concatenateBytes( 
                         till, 
                         concatenateBytes 
                           (nonce, etype) 
                       ) 
                      ) 
                    ) 
                   ) 
                 ) 
                ) 
              ); 
    ticketRequest = getTagAndLengthBytes( 
              ASN1DataTypes.APPLICATION_TYPE, 
                10, 
                getSequenceBytes( 
                 concatenateBytes( 
                   pvno, 
                   concatenateBytes 
                     (msg_type, req_body) 
                 ) 
                ) 
              ); 
    /****** NEW CODE BEGINS ******/ 
    try { 
       Datagram dg = dc.newDatagram(ticketRequest, ticketRequest.length); 
       dc.send(dg); 
     } catch (IllegalArgumentException il) { 
       il.printStackTrace(); 
     } 
     catch (Exception io) { 
       io.printStackTrace(); 
     } 
     byte ticketResponse[] = null; 
     try 
     { 
  Datagram dg = dc.newDatagram(700); 
      dc.receive(dg); 
     if (dg.getLength() > 0) { 
     ticketResponse = new byte[dg.getLength()]; 
       System.arraycopy(dg.getData(), 0, ticketResponse, 0, dg.getLength()); 
     } else 
        return null; 
    } catch (IOException ie){ 
     ie.printStackTrace(); 
    } 
    /****** NEW CODE ENDS ******/  
    return ticketResponse; 
  }//getTicketResponse 

上一页  1 2 3 4 5 6 7  下一页

Tags:Kerberos JME 应用程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接