最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java數(shù)字簽名提供XML安全

 更新時間:2018年08月22日 08:49:29   作者:weistar  
在本篇文章中我們給大家整理了關(guān)于Java數(shù)字簽名提供XML安全的知識點內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。

用Java數(shù)字簽名提供XML安全

眾所周知,XML在產(chǎn)品和項目開發(fā)中起著非常重要的作用。通過XML文檔可以獲取很多信息,還可以使用XML文件進行CRUD(增加、查詢、更新和 刪除)操作。然而值得注意的是,我們?nèi)绾未_保XML中的數(shù)據(jù)是來自經(jīng)過認(rèn)證的可信和可靠的來源。關(guān)于XML文件數(shù)據(jù)的可靠性和真實性存在很多問題。通常的 情況是,開發(fā)者直接處理XML文件而不去考慮數(shù)據(jù)的可靠性。有一些情況提出了上面的所有問題?,F(xiàn)實生活中,每當(dāng)我們從郵局收到一封信件時我們?nèi)绾未_定這封 信是來自我們的朋友?依據(jù)可能是他/她的習(xí)慣用語、用詞或者郵件詳細地址。也可能是他/她的個性簽名。如今,我們收到的信件可能被某人進行了篡改,添加了 其他內(nèi)容?;谏鲜鲈颍ǔN覀儠炞C朋友的手寫簽名。當(dāng)然這些是關(guān)于來自郵局的普通郵件。電子消息又該如何?我們?nèi)绾悟炞C電子消息的真實性?這種情況 我們會采用數(shù)字簽名。本文會對保證數(shù)據(jù)完整性的XML數(shù)字簽名技術(shù)進行簡要介紹,并且展示如何為XML文件附加電子簽名及其驗證過程。

使用的技術(shù)

過去幾年里,XML數(shù)字簽名取得了快速發(fā)展,在金融領(lǐng)域尤其如此。在開始討論之前,讓我們考慮一個典型場景:想象一下,某個組織將所有雇員的薪資內(nèi) 容用XML文件發(fā)送給所得稅部門。那么現(xiàn)在的問題是:所得稅部門如何驗證這份XML文件?這就是說,IT部門需要驗證該組織的敏感信息。IT部門需要確保 XML文件的來源可信,并且在IT部門收到之前沒有經(jīng)過篡改——也就是說文檔的內(nèi)容沒有在傳遞中被修改。首先,我們需要理解數(shù)字簽名的概念。數(shù)字簽名是一 種用來驗證文檔發(fā)自可信方的電子簽名。它確保了文檔的原始內(nèi)容在傳輸中沒有受到修改。數(shù)字簽名可以用于任何加密和非加密消息,因此接收方可以識別發(fā)送者的 身份,并確認(rèn)消息沒有被其他人修改。根據(jù)維基百科的定義:“數(shù)字簽名是一種驗證數(shù)字信息或文檔的數(shù)學(xué)方法”。一個有效的數(shù)字簽名可以讓接收者確認(rèn)收到的消 息來自已知發(fā)送方,發(fā)送者不能否認(rèn)自己發(fā)送了此消息(提供認(rèn)證和不可否認(rèn)性)并且此消息在傳輸中未經(jīng)修改(提供完整性)。數(shù)字簽名通常被用在軟件發(fā)布、金 融事務(wù)和其他需要檢測偽造或篡改的重要場合。

下面讓我們來看完整的一個帶有數(shù)字簽名的XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><SalaryDeposit> 
  <Organisation> 
    <Name>DDLab Inc</Name> 
    <AccountNo>SBC-12345789</AccountNo> 
  </Organisation> 
  <Employees> 
    <Emp> 
      <Name>John Abraham</Name> 
      <AccountNo>SB-001</AccountNo> 
      <Amount>1234</Amount> 
    </Emp> 
    <Emp> 
      <Name>Bipasha Basu</Name> 
      <AccountNo>SB-002</AccountNo> 
      <Amount>2334</Amount> 
    </Emp> 
    <Emp> 
      <Name>Vidya Balan</Name> 
      <AccountNo>SB-003</AccountNo> 
      <Amount>3465</Amount> 
    </Emp> 
    <Emp> 
      <Name>Debadatta Mishra</Name> 
      <AccountNo>SB-007</AccountNo> 
      <Amount>5789</Amount> 
    </Emp> 
    <Emp> 
      <Name>Priti Zinta</Name> 
      <AccountNo>SB-009</AccountNo> 
      <Amount>1234</Amount> 
    </Emp> 
  </Employees> 
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
      <Reference URI=""> 
       <Transforms> 
         <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
       </Transforms> 
       <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
       <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue> 
      </Reference> 
    </SignedInfo> 
    <SignatureValue> 
aUEMrCT5dzeOfSNaznzoT0If8WZ8KQcMNXDqtoeseonVk3NqOk9ctcxrf3QVX3wP6810DDRPdI6l 
   e8ccG64Ge0HjkO+aYC5+c2L/qKBzwtSbl/olJEuFU2DVxBQO+K29TTUJfxpVzC9Zf2pvT+1NRj0f 
   2/ofHujYZ01D6+YqI8c= 
    </SignatureValue> 
    <KeyInfo> 
      <KeyValue> 
       <RSAKeyValue> 
         <Modulus> 
jfAd5uV38L36+lDZJrqfH9oLN86VJezXYfAeU+lrFoHlKAXVJLAi9hKvBHQRer4tPfdez6iSBKsl 
      6IHkPnVRAKt0xU99uxi5QpymsWAX3qnBqHlw9Z70PwyZ+Xysfw4Q2tK2HtSgUOhMuaUcIf9sbHvf 
      gbvcRPgxDZZqfIzDmDU=</Modulus> 
         <Exponent>AQAB</Exponent> 
       </RSAKeyValue> 
      </KeyValue> 
    </KeyInfo> 
  </Signature> 
</SalaryDeposit> 

上面是一個帶有簽名的XML文件,該文件可以隨時進行驗證。文件中包了含雇員名稱、帳號和薪資信息。然而,實際的數(shù)字簽名通 過<Signature></Signature>標(biāo)記進行附加。<Signature> 標(biāo)記中的信息提供了文檔的真實性。正如你看到的那樣,雖然你可以隨意修改其中的數(shù)據(jù),但是這種修改會在隨后的簽名驗證中被查到。
基本上數(shù)字簽名有三種類型:

  1. 封內(nèi)簽名
  2. 封外簽名
  3. 分離簽名

封內(nèi)簽名

這種簽名是將簽名作為XML對象的子信息,也就是說 <Signature>是郵件中XML文件的子標(biāo)簽。封內(nèi)數(shù)字簽名的結(jié)構(gòu)如下:

<RootElement> 
 <Signature> 
 …… 
 </Signature> 
</ RootElement> 

本文會介紹如何創(chuàng)建XML封內(nèi)數(shù)字簽名。

封外簽名

這種簽名將XML文檔包含到Signature對象,也就是說<Signature>標(biāo)簽是簽名XML文件的根元素。封外簽名結(jié)構(gòu)如下:

<Signature > 
  < MyXMLDocument > 
  …… 
  </ MyXMLDocument > 
</Signature> 

分離簽名

這種情況下,簽名是獨立生成的不作為XML的一部分。也就是說你會擁有兩個XML文件:一個待簽名的XML文件,另一個是XML簽名。下面是分離簽名的XML結(jié)構(gòu):

<Signature> 
…… 
</Signature> 

XML數(shù)字簽名文件結(jié)構(gòu)如下:

<Signature xmlns=""> 
  <SignedInfo> 
    <CanonicalizationMethod Algorithm="" /> 
    <SignatureMethod Algorithm="" /> 
    <Reference URI=""> 
      <Transforms> 
        <Transform Algorithm="" /> 
        </Transforms> 
      <DigestMethod Algorithm="" /> 
      <DigestValue></DigestValue> 
    </Reference> 
  </SignedInfo> 
  <SignatureValue></SignatureValue> 
  <KeyInfo> 
    <KeyValue> 
      <RSAKeyValue> 
        <Modulus></Modulus> 
        <Exponent></Exponent> 
      </RSAKeyValue> 
    </KeyValue> 
  </KeyInfo> 
</Signature> 

XML中<Signature>有3個子標(biāo)簽,結(jié)構(gòu)如下:

<Signature> 
  <SignedInfo></SignedInfo> 
  <SignatureValue></SignatureValue> 
  <KeyInfo></KeyInfo> 
</Signature> 

這里<Signature>是XML數(shù)字簽名的根元素,這一點由W3C建議并且必須遵守。<SignedInfo>元素是你的簽名信息;<SignatureValue>包含了實際的簽名以及使用Base64加密的內(nèi)容;最后<KeyInfo>表示公鑰。讓我們再看一下<SignedInfo>標(biāo)簽,結(jié)構(gòu)如下:

<SignedInfo> 
  <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
  <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
  <Reference URI=""> 
    <Transforms> 
      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
    </Transforms> 
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
    <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue> 
  </Reference> 
</SignedInfo> 

當(dāng)使用Java創(chuàng)建XML數(shù)字簽名時,SignedInfo對象被用來在數(shù)字簽名的Signature標(biāo)簽內(nèi)創(chuàng)建元素。這也是W3C建議的XML簽名標(biāo)準(zhǔn)中的一部分。

XML標(biāo)簽<KeyInfo>的結(jié)構(gòu)如下:

<KeyInfo> 
  <KeyValue> 
    <RSAKeyValue> 
      <Modulus></Modulus> 
      <Exponent></Exponent> 
    </RSAKeyValue> 
  </KeyValue> 
</KeyInfo> 

KeyInfo>標(biāo)記包含了需要數(shù)學(xué)計算的相關(guān)信息,主要有公鑰的系數(shù)和指數(shù)。
要創(chuàng)建XML數(shù)字簽名可以遵循下列步驟:

  1. 生成一組私鑰和公鑰。
  2. 獲得原始XML文件。
  3. 通過Java API使用私鑰和公鑰為原始的XML文件簽名,生成帶有XML簽名的文檔。

讓我們看看使用Java生成XML簽名的相關(guān)代碼:

public void generateXMLDigitalSignature(String originalXmlFilePath, 
String destnSignedXmlFilePath, String privateKeyFilePath, String publicKeyFilePath) { 
  // 獲取XML文檔對象 
  Document doc = getXmlDocument(originalXmlFilePath); 
  
  // 創(chuàng)建XML簽名工廠 
  XMLSignatureFactory xmlSigFactory = XMLSignatureFactory.getInstance("DOM"); 
  PrivateKey privateKey = new KryptoUtil().getStoredPrivateKey(privateKeyFilePath); 
  DOMSignContext domSignCtx = new DOMSignContext(privateKey, doc.getDocumentElement()); 
  Reference ref = null; 
  SignedInfo signedInfo = null; 
  try { 
    ref = xmlSigFactory.newReference("", xmlSigFactory.newDigestMethod(DigestMethod.SHA1, null), 
    Collections.singletonList(xmlSigFactory.newTransform(Transform.ENVELOPED, 
    (TransformParameterSpec) null)), null, null); 
    signedInfo = xmlSigFactory.newSignedInfo( 
    xmlSigFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, 
    (C14NMethodParameterSpec) null), 
    xmlSigFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null), 
    Collections.singletonList(ref)); 
  } catch (NoSuchAlgorithmException ex) { 
    ex.printStackTrace(); 
  } catch (InvalidAlgorithmParameterException ex) { 
    ex.printStackTrace(); 
  } 
  
  // 傳入公鑰路徑 
  KeyInfo keyInfo = getKeyInfo(xmlSigFactory, publicKeyFilePath); 
  
  // 創(chuàng)建新的XML簽名 
  XMLSignature xmlSignature = xmlSigFactory.newXMLSignature(signedInfo, keyInfo); 
  try { 
    // 對文檔簽名 
    xmlSignature.sign(domSignCtx); 
  } catch (MarshalException ex) { 
    ex.printStackTrace(); 
  } catch (XMLSignatureException ex) { 
    ex.printStackTrace(); 
  } 
  
  // 存儲簽名過的文檔 
  storeSignedDoc(doc, destnSignedXmlFilePath); 
} 

XML簽名驗證

數(shù)字簽名的驗證包含以下操作:

驗證數(shù)字簽名

  • 計算<SignedInfo>元素摘要。
  • 使用公鑰解密<SignatureValue>元素。
  • 比較上面兩個值。
  • 計算引用摘要
  • 重新計算<SignedInfo>元素引用摘要。
  • 將它們與<DigestValue>中的摘要比較。

為了驗證XML簽名文檔,需要完成下列步驟

  1. 得到XML文檔和公鑰。
  2. 驗證<SignedInfo> 元素的數(shù)字簽名。
  3. 計算<SignedInfo> 元素的摘要并對值進行比較。

讓我們看看下面這段XML數(shù)字簽名示例代碼:

public static boolean isXmlDigitalSignatureValid(String signedXmlFilePath, String pubicKeyFilePath) throws Exception { 
  boolean validFlag = false; 
  Document doc = getXmlDocument(signedXmlFilePath); 
  NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature"); 
  if (nl.getLength() == 0) { 
    throw new Exception("No XML Digital Signature Found, document is discarded"); 
  } 
  
  PublicKey publicKey = new KryptoUtil().getStoredPublicKey(pubicKeyFilePath); 
  DOMValidateContext valContext = new DOMValidateContext(publicKey, nl.item(0)); 
  XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); 
  XMLSignature signature = fac.unmarshalXMLSignature(valContext); 
  validFlag = signature.validate(valContext); 
  return validFlag; 
} 

如上面示例代碼所示,XML簽名可以通過重新計算<SignedInfo>的摘要值進行驗證,驗證算法由 <SignatureMethod>元素指定;使用公鑰可以驗證<SignedInfo>摘要中 的<SignatureValue>值是否正確。 引用摘要會在<SignedInfo>元素中重新計算,并與<Reference> 元素中對應(yīng)的<DigestValue> 進行比對。接下來,讓我們熟悉一下XML數(shù)字簽名相關(guān)的Java組件。

XMLSignatureFactory

XMLSignatureFactory是生成XML文檔數(shù)字簽名的工廠對象。對象的創(chuàng)建如下列代碼所示:

XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM"); 

DOMSignContext

DOMSignContext對象用來生成DOM樹。在創(chuàng)建數(shù)字簽名的過程中,DOM樹會被附上XML數(shù)字簽名。DOMSignContext對象要求輸入私鑰和XML文檔的根元素。

Reference

Reference對象用來在Signature 標(biāo)記的SignedInfo內(nèi)部創(chuàng)建XML數(shù)字簽名。對象創(chuàng)建的遵循“W3C XML簽名文法和處理”規(guī)則。Reference的基本結(jié)構(gòu)如下:

<Reference URI=""> 
  <Transforms> 
  <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
  </Transforms> 
  <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
  <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue> 
</Reference> 

SignedInfo

類似的,SignedInfo對象可以在數(shù)字簽名的Signature標(biāo)記內(nèi)部創(chuàng)建元素。創(chuàng)建的規(guī)則同樣遵循“W3C XML數(shù)字簽名協(xié)議”。SignedInfo的基本結(jié)構(gòu)如下:

<SignedInfo> 
  <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
  <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
  <Reference URI=""> 
    <Transforms> 
    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
    </Transforms> 
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
    <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue> 
  </Reference> 
</SignedInfo> 

XMLSignature

最后,XMLSignature對象用來創(chuàng)建XML文檔的封面簽名。按照W3C的建議,簽名對象應(yīng)該作為XML數(shù)字簽名的根元素。
完整的結(jié)構(gòu)如下:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
  <SignedInfo> 
    <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
    <Reference URI=""> 
      <Transforms> 
      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
      </Transforms> 
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
      <DigestValue>bHS+6uf8KbJV4AGzoHNHLfnXvKM=</DigestValue> 
    </Reference> 
  </SignedInfo> 
  <SignatureValue>aUEMrCT5dzeOfSNaznzoT0If8WZ8KQcMNXDqtoeseonVk3NqOk9ctcxrf3QVX3wP6810DDRPdI6l 
  e8ccG64Ge0HjkO+aYC5+c2L/qKBzwtSbl/olJEuFU2DVxBQO+K29TTUJfxpVzC9Zf2pvT+1NRj0f 
  2/ofHujYZ01D6+YqI8c=</SignatureValue> 
  <KeyInfo> 
    <KeyValue> 
    <RSAKeyValue> 
      <Modulus>jfAd5uV38L36+lDZJrqfH9oLN86VJezXYfAeU+lrFoHlKAXVJLAi9hKvBHQRer4tPfdez6iSBKsl 
      6IHkPnVRAKt0xU99uxi5QpymsWAX3qnBqHlw9Z70PwyZ+Xysfw4Q2tK2HtSgUOhMuaUcIf9sbHvf 
      gbvcRPgxDZZqfIzDmDU=</Modulus> 
      <Exponent>AQAB</Exponent> 
    </RSAKeyValue> 
    </KeyValue> 
  </KeyInfo> 
</Signature> 

為了有一個完成的理解,可以從這里下載完整的Netbeans項目代碼。

可以用你最喜歡的Java IDE對項目進行配置;也可以在source文件夾下運行程序。這個項目已經(jīng)包含了公鑰和私鑰。如果想要自己生成,可以運行 “TestGenerateKeys”類生成一對公鑰和私鑰。通過指定自己的XMI文件,還可以查看XML簽名的生成過程。

以上就是本次我們給大家整理的內(nèi)容的全部,感謝大家對腳本之家的支持,如果大家還有不明白的可以在下方留言區(qū)討論。

相關(guān)文章

  • Java JDBC連接Kerberos認(rèn)證的HIVE和Impala方式

    Java JDBC連接Kerberos認(rèn)證的HIVE和Impala方式

    本文主要介紹了HiveJDBC和ImpalaJDBC的使用方法,包括版本對應(yīng)、Maven安裝、主機名配置、端口開通、JDBC連接和Kerberos認(rèn)證等
    2025-02-02
  • PostMan post請求發(fā)送Json數(shù)據(jù)的方法

    PostMan post請求發(fā)送Json數(shù)據(jù)的方法

    下面小編就為大家分享一篇PostMan post請求發(fā)送Json數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • java實現(xiàn)同步的幾種方式(示例詳解)

    java實現(xiàn)同步的幾種方式(示例詳解)

    這篇文章主要介紹了java實現(xiàn)同步的幾種方式,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-12-12
  • springboot實現(xiàn)增加黑名單和白名單功能

    springboot實現(xiàn)增加黑名單和白名單功能

    本文主要介紹了springboot實現(xiàn)增加黑名單和白名單功能,就是單純的實現(xiàn)filter,然后注冊到springboot里面,在filter里面進行黑白名單的篩選,感興趣的可以了解一下
    2024-05-05
  • springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    這篇文章主要介紹了springboot如何使用logback-spring配置日志格式,并分環(huán)境配置的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot整合Swagger和Actuator的使用教程詳解

    SpringBoot整合Swagger和Actuator的使用教程詳解

    Swagger 是一套基于 OpenAPI 規(guī)范構(gòu)建的開源工具,可以幫助我們設(shè)計、構(gòu)建、記錄以及使用 Rest API。本篇文章主要介紹的是SpringBoot整合Swagger(API文檔生成框架)和SpringBoot整合Actuator(項目監(jiān)控)使用教程。感興趣的朋友一起看看吧
    2019-06-06
  • mybatis insert foreach循環(huán)插入方式

    mybatis insert foreach循環(huán)插入方式

    這篇文章主要介紹了mybatis insert foreach循環(huán)插入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 四個Java常見分布式鎖的選型和性能對比

    四個Java常見分布式鎖的選型和性能對比

    當(dāng)涉及到分布式系統(tǒng)中的并發(fā)控制和數(shù)據(jù)一致性時,分布式鎖是一種常見的解決方案,本文將對幾種常見的分布式鎖實現(xiàn)原理、實現(xiàn)示例、應(yīng)用場景以及優(yōu)缺點進行詳細分析,需要的可以參考一下
    2023-05-05
  • Java  中橋接模式——對象結(jié)構(gòu)型模式的實例詳解

    Java 中橋接模式——對象結(jié)構(gòu)型模式的實例詳解

    這篇文章主要介紹了Java 中橋接模式——對象結(jié)構(gòu)型模式的實例詳解的相關(guān)資料,希望通過本文大家能掌握這部分知識,需要的朋友可以參考下
    2017-09-09
  • SpringBoot + validation 接口參數(shù)校驗的思路詳解

    SpringBoot + validation 接口參數(shù)校驗的思路詳解

    這篇文章主要介紹了SpringBoot + validation 接口參數(shù)校驗,本文通過項目實踐+場景分析給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10

最新評論

右玉县| 盐山县| 海门市| 旬阳县| 开封市| 神池县| 宁武县| 靖安县| 日照市| 郑州市| 清原| 调兵山市| 乡城县| 岚皋县| 宝鸡市| 太和县| 赣榆县| 托克托县| 法库县| 黑河市| 五大连池市| 资兴市| 石门县| 嘉兴市| 铅山县| 海宁市| 昭苏县| 廉江市| 桦甸市| 夹江县| 尚志市| 鄂温| 延长县| 临夏县| 方城县| 高雄市| 渝中区| 翁牛特旗| 邵东县| 巫溪县| 榆树市|