国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用 Kerberos 為 J2ME 應用程序上鎖(1)

2019-11-18 15:54:20
字體:
來源:轉載
供稿:網友

  在本文中,我將開始實現生成并處理這些消息的 J2ME 類。我將首先簡單描述構成這個基于 J2ME 的 Kerveros 客戶機的主要類的作用,然后我將解釋并展示這些類如何生成在第一篇文章中討論過的基本 ASN.1 數據類型。在第三節中,我將展示如何生成一個用于在 Kerveros 通信中進行加密和解密的密鑰。最后一節將展示 J2ME 客戶機如何生成對 Kerveros 票據的請求。
  
  基于 J2ME 的 Kerveros 客戶機中的類
  在本文中,將要討論三個 J2ME 類的操作:
  
  ASN1DataTypes
  KerberosClient
  KerberosKey
  ASN1DataTypes 類將包裝所有一般性的 ASN.1 功能,如發布像 INTEGER 和 STRING 這樣的通用數據類型。KerberosClient 類擴展 ASN1DataTypes 類,使用它的底層功能,并提供所有特定于 Kerveros 的功能。因此,可以說我將所需要的功能簡單地分為兩組:所有一般性的 ASN.1 功能都在 ASN1DataTypes 類中,而所有特定于 Kerveros 的功能都在 KerberosClient 類中。這提高了代碼的重用性。假如您希望構建自己的、使用 ASN.1 功能的非 Kerveros 應用程序,那么您可以使用 ASN1DataTypes 類。
  
  Kerberos 定義了一種利用用戶的密碼生成密鑰的算法。KerberosKey 類實現了這種算法 。在 Kerveros 通信中您將需要這個密鑰。
  
  我將在本文分別展示這些類中的每個方法。我還在一個單獨的 源代碼下載 中加入了這些類。這個包將所有東西放到一組類中,可以將它們編譯為一個 J2ME 項目。這個下載包含以下文件:
  
  ReadMe.txt,它包含描述如何根據本文的需要練習這些代碼的指導。
  ASN1DataTypes.java,它實現了ASN1DataTypes 類。
  KerberosClient.java,它實現了 KerberosClient 類。
  KerberosKey.java,它實現了 KerberosKey 類。
  J2MEClientMIDlet.java,它提供了可以用來測試這些代碼的一個非常簡單的 MIDlet 包裝器。
  現在,我將進一步探討這些類的細節。
  
  生成基本 ASN.1 數據類型
  清單 1 中顯示的 ASN1DataTypes 類處理生成和處理 ASN.1 數據結構所需要的所有底層功能。這個類包含兩種方法:生成(authoring) 方法負責生成 ASN.1 數據結構,而 處理(PRocessing) 方法負責處理已生成的或者從遠程應用程序收到的消息。我將在本文中解釋并實現生成方法,在本系列的下一篇文章中討論處理方法。
  
  清單 1 只包含 ASN.1 類中不同方法的聲明。我將在后面的幾節中用單獨的清單展示每一個方法的實現。
  
  清單 1. ASN1DataTypes 類
  
  public class ASN1DataTypes
  {
    public byte[] getLengthBytes(int length){}
    public byte[] getIntegerBytes (int integerContents){}
    public byte[] getGeneralStringBytes (String generalStringContent){}
    public byte[] getOctetStringBytes (byte[] octetStringContents){}
    public byte[] getBitStringBytes (byte[] content){}
    public byte[] getGeneralizedTimeBytes (byte[] generalizedTimeContent){}
    public byte[] concatenateBytes (byte[] array1, byte[] array2){}
    public byte[] getSequenceBytes (byte[] sequenceContents){}
    public byte[] getTagAndLengthBytes (int tagType, int tagNumber, byte[] tagContents){}
  
  }//ASN1DataTypes
  
  getLengthBytes()
  (在清單 2 中顯示的)這個方法將一個整數值(length)作為參數。它生成一個該長度的 ASN.1 表示,并返回一個符合 ASN.1 長度格式的字節數組。
  
  清單 2. getLengthBytes() 方法
  
    public byte[] getLengthBytes(int length)
    {
      if (length < 0)
        return null;
  
      byte lengthBytes[];
  
      if (length <= 127)
      {
        lengthBytes = new byte[1];
        lengthBytes[0] = (byte)(length & 0xff);
      }
      else
      {
        int tempLength = length;
        int bytesRequired = 2;
        do
        {
          tempLength = tempLength / 256;
          if (tempLength > 0)
            bytesRequired ++;
        }while (tempLength > 0);
  
        lengthBytes = new byte[bytesRequired];
  
        byte firstLengthByte = (byte) (bytesRequired -1);
  
        firstLengthByte = 0x80;
        lengthBytes[0] = firstLengthByte;
  
        int j = bytesRequired - 1;
  
        for (int i=1; i < bytesRequired; i++) {
          j--;
          lengthBytes[i] = (byte)(length >>> (j*8) & 0xff);
        }//for
      }//else
  
      return lengthBytes;
  
    }//getLengthBytes
  
  回想一下在本系列的 第一篇文章 中對表 2 的討論,有兩種表示字節長度的方法:單字節表示法和多字節表示法。單字節長度表示法用于表示小于或者等于 127 的長度值,而當長度值大于 127 時使用多字節長度表示法。
  
  getLengthBytes() 方法首先檢查長度值是否為負。假如為負,則只是返回 null,因為我不能處理負值。
  
  然后這個方法檢查長度值是否小于或者等于 127。假如是,就需要使用單字節長度表示法。
  
  注重在 J2ME 中一個整數是 4 字節數據,而單字節長度表示法只需要 1 個字節。假如長度參數是 0 到 127 之間(包括這個兩數)的一個值,那么其字節表達就在 0x00000000 與 0x0000007f 之間(意味著只有最低有效位字節包含有用的數據)。將這個整數造型為一個單字節時,只有最低有效位字節(0x00 到 0x7f)會作為十六進制值拷貝到單字節數組。因此,假如長度值在 0 到 127 之間,那么我可以只執行該長度與 0xff 之間的一個按位 AND 操作。這個操作會得到一個整數,它有效的最高 3 個字節都將填入零。因此,我可以將按位操作的結果造型為一個字節,將這個字節放入一個單字節數組,并將這個數組返回給調用應用程序。
  
  假如長度值大于 127,那么我必須使用多字節長度表示法,它至少使用 2 字節數據。第一個字節表明長度字節的字節數,后面是實際的長度字節(有關這種格式的具體解釋請參閱 第一篇文章)。
  
  假如長度值小于 256,那么就需要總共 2 個長度字節 —— 1 個字節表明還有一個長度字節,1 個字節包含實際的長度值。假如長度值至少為 256 并小于 65536(256 乘 256),那么就需要總共 3 個長度字節 —— 1 個字節表明還有 2 個長度字節,兩個字節包含實際的長度值。
  
  因此,在多字節格式中所需要的字節數取決于長度值。這就是為什么在 getLengthBytes() 的 else 塊的 do-while 循環中要計算長度字節所需要的字節數。
  
  確定所需要字節數的方法很簡單。我聲明了一個名為 bytesRequired 的字節計數器,從 2 開始計數(所需要的最少字節數),將長度值除以 256,并檢查商是否大于或者等于 1。假如是,那么就表明原始長度值大于 256,因而需要至少 3 個字節,所以我增加計數器(bytesRequired)。
  
  我繼續將長度值除以 256 并增加字節計數器,直到除得的值小于 1。這時,我就知道找到了在多字節整數格式中需要的字節數。
  
  知道了所需要的字節數后,我就實例化一個具有適當大小的字節數組。自然,長度字節中的第一個字節將表明還有多少個長度字節。因此,我只是將所需要的字節數減 1(bytesRequired-1),并拷貝到一個名為 firstLengthByte 的字節中。
  
  看一下清單 2 中 getLengthBytes() 方法中的 firstLengthByte = 0x80 這一行代碼。這一行代碼對 firstLengthByte 和 0x80 (1000 0000)進行按拉 OR 操作,并將結果儲存到 firstLengthByte 中。這種邏輯 OR 操作會將 firstLengthByte 的最左邊(最高有效)位設置為 1。回想在本系列 第一篇文章 中的討論,在希望使用多字節整數格式的時候,必須將第一個長度字節的最左邊一位設置為 1。
  
  下一行(lengthBytes[0]=firstLengthByte)只是拷貝在包含長度字節的數組的開始位置上的 firstLengthByte。然后,有一個 for 循環,它將長度字節從長度參數中拷貝到在 lengthBytes 數組中它們的正確位置上。當 for 循環退出時,就得到了符合 ASN.1 格式的這個 lengthBytes 數組。清單 2 中 getLengthBytes() 方法的最后一行返回這個數組。
  
  getIntegerBytes()
  這個方法取一個整數(value)作為參數并返回以 ASN.1 INTEGER表達的這個整數值。回想一下在本系列 第一篇文章 的表 1 中曾提到,在ASN.1 中 INTEGER 是一種通用數據類型。
  
  清單 3 中顯示了 getIntegerBytes() 方法的實現。
  
  清單 3. getIntegerBytes() 方法
  
    public byte[] getIntegerBytes (int integerContents)
    {
      //1. Declare a byte array named finalBytes, which will
      //  hold all the bytes of the ASN.1 byte array representation.
      byte finalBytes[];
  
      //2. Calculate the number of bytes required to ho

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 元朗区| 集贤县| 湘潭市| 梨树县| 禹州市| 阿拉善左旗| 高密市| 梁山县| 南平市| 彭阳县| 安化县| 河津市| 和田县| 鄱阳县| 盐津县| 淮滨县| 阳泉市| 阳东县| 库车县| 西乌珠穆沁旗| 泊头市| 河间市| 土默特左旗| 云安县| 宜兴市| 淮北市| 麦盖提县| 扶风县| 申扎县| 永和县| 陇南市| 景德镇市| 张家港市| 舒城县| 鹿邑县| 资中县| 公主岭市| 通河县| 临澧县| 遂川县| 石渠县|