使用dubbo 完成對(duì)數(shù)據(jù)加密

  1. 文檔地址
    2.項(xiàng)目需求:對(duì)dubbo調(diào)用的數(shù)據(jù)進(jìn)行加密傳輸, 因?yàn)檎{(diào)用過(guò)程需要通過(guò)公網(wǎng)傳輸數(shù)據(jù),數(shù)據(jù)不安全,需要對(duì)數(shù)據(jù)加密,沒(méi)有發(fā)現(xiàn)dubbo有對(duì)數(shù)據(jù)加密的操作,如果有大佬發(fā)現(xiàn)請(qǐng)告知,畢竟自己實(shí)現(xiàn)不如用官方的

  2. 本文使用的是spi拓展, 對(duì)serialization序列化進(jìn)行拓展,實(shí)現(xiàn)對(duì)數(shù)據(jù)的加密,在使用時(shí), 使用了Hessian2序列化, 但是過(guò)程中對(duì)數(shù)據(jù)進(jìn)行加密

  3. 思路: 由于dubbo存在provider和consumer, 數(shù)據(jù)加密和解密需要在provider寫(xiě)出數(shù)據(jù)時(shí)對(duì)數(shù)據(jù)進(jìn)行加密,而consumer需要在接收數(shù)據(jù)時(shí)進(jìn)行解密
    可以研究一下dubbo的provider和consumer調(diào)用過(guò)程

項(xiàng)目結(jié)構(gòu):


image.png

5.上代碼:

//服務(wù)提供者
public class ProviderCustomSerialization implements Serialization {

    public static final byte ID = 2;


    @Override
    public byte getContentTypeId() {
        return ID;
    }

    @Override
    public String getContentType() {
        return "x-application/hessian2";
    }

    @Override
    public ObjectOutput serialize(URL url, OutputStream out) throws IOException {
        return new Hessian2ObjectOutput(out);
    }

    @Override
    public ObjectInput deserialize(URL url, InputStream is) throws IOException {
        return new CustomObjectInput(is);
    }

}
//服務(wù)消費(fèi)者
public class ConsumerCustomSerialization implements Serialization {

    public static final byte ID = 2;


    @Override
    public byte getContentTypeId() {
        return ID;
    }

    @Override
    public String getContentType() {
        return "x-application/hessian2";
    }

    @Override
    public ObjectOutput serialize(URL url, OutputStream out) throws IOException {
        return new CustomObjectOutput(out);
    }

    @Override
    public ObjectInput deserialize(URL url, InputStream is) throws IOException {
        return new Hessian2ObjectInput(is);
    }

}

服務(wù)消費(fèi)者:


public class CustomObjectInput implements ObjectInput {
    private final Hessian2Input mH2i;


    public CustomObjectInput(InputStream is) {
        mH2i = new Hessian2Input(is);
        mH2i.setSerializerFactory(Hessian2SerializerFactory.SERIALIZER_FACTORY);
    }

    @Override
    public boolean readBool() throws IOException {
        return mH2i.readBoolean();
    }

    @Override
    public byte readByte() throws IOException {
        return (byte) mH2i.readInt();
    }

    @Override
    public short readShort() throws IOException {
        return (short) mH2i.readInt();
    }

    @Override
    public int readInt() throws IOException {
        return mH2i.readInt();
    }

    @Override
    public long readLong() throws IOException {
        return mH2i.readLong();
    }

    @Override
    public float readFloat() throws IOException {
        return (float) mH2i.readDouble();
    }

    @Override
    public double readDouble() throws IOException {
        return mH2i.readDouble();
    }

    @Override
    public byte[] readBytes() throws IOException {
        return mH2i.readBytes();
    }

    @Override
    public String readUTF() throws IOException {
        return mH2i.readString();
    }

    @Override
    public Object readObject() throws IOException {
        return mH2i.readObject();
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T> T readObject(Class<T> cls) throws IOException,
            ClassNotFoundException {
        EncryptionUtils instance = EncryptionUtils.getInstance();
        String s = instance.DESdecode(mH2i.readObject().toString(), EncryptionUtils.secret);
        return JSON.parseObject(s, cls);
    }

    @Override
    public <T> T readObject(Class<T> cls, Type type) throws IOException, ClassNotFoundException {
        return readObject(cls);
    }

}

服務(wù)提供者

public class CustomObjectOutput implements ObjectOutput {
    private final Hessian2Output mH2o;


    public CustomObjectOutput(OutputStream os) {
        mH2o = new Hessian2Output(os);
        mH2o.setSerializerFactory(Hessian2SerializerFactory.SERIALIZER_FACTORY);
    }

    @Override
    public void writeBool(boolean v) throws IOException {
        mH2o.writeBoolean(v);
    }

    @Override
    public void writeByte(byte v) throws IOException {
        mH2o.writeInt(v);
    }

    @Override
    public void writeShort(short v) throws IOException {
        mH2o.writeInt(v);
    }

    @Override
    public void writeInt(int v) throws IOException {
        mH2o.writeInt(v);
    }

    @Override
    public void writeLong(long v) throws IOException {
        mH2o.writeLong(v);
    }

    @Override
    public void writeFloat(float v) throws IOException {
        mH2o.writeDouble(v);
    }

    @Override
    public void writeDouble(double v) throws IOException {
        mH2o.writeDouble(v);
    }

    @Override
    public void writeBytes(byte[] b) throws IOException {
        mH2o.writeBytes(b);
    }

    @Override
    public void writeBytes(byte[] b, int off, int len) throws IOException {
        mH2o.writeBytes(b, off, len);
    }

    @Override
    public void writeUTF(String v) throws IOException {
        mH2o.writeString(v);
    }

    @Override
    public void writeObject(Object obj) throws IOException {
        EncryptionUtils instance = EncryptionUtils.getInstance();
        String s = instance.DESencode(JSON.toJSONStringWithDateFormat(obj, "yyyy-MM-dd HH:mm:ss"), EncryptionUtils.secret);
        mH2o.writeObject(s);
    }

    @Override
    public void flushBuffer() throws IOException {
        mH2o.flushBuffer();
    }
}
  1. 配置 provider和consumer都需要配置serialization這項(xiàng)
 #dubbo相關(guān)配置
  dubbo:
    application:
      #配置當(dāng)前服務(wù)的名稱(chēng)
      name: master
    protocol:
      #服務(wù)提供者提供服務(wù)所暴露的端口
      port: 20880
      #配置自定義的序列化方式生效
      serialization: CustomSerialization
    consumer:
      check: false
src
 |-main
    |-java
        |-com
            |-xxx
                |-XxxSerialization.java (實(shí)現(xiàn)Serialization接口)
                |-XxxObjectInput.java (實(shí)現(xiàn)ObjectInput接口)
                |-XxxObjectOutput.java (實(shí)現(xiàn)ObjectOutput接口)
    |-resources
        |-META-INF
            |-dubbo
                |-com.alibaba.dubbo.common.serialize.Serialization (純文本文件静秆,內(nèi)容為:xxx=com.xxx.XxxSerialization)

創(chuàng)建以上的項(xiàng)目結(jié)構(gòu)
注意:這里和官方文檔不一致,包名用的是com.alibaba,而不是org.apache,因?yàn)榇藭r(shí)dubbo版本還沒(méi)將包掃描的路徑修改,已經(jīng)向官方反映
spring-boot-starter-dubbo:1.1.2

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晤柄,更是在濱河造成了極大的恐慌减牺,老刑警劉巖晚缩,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浅役,死亡現(xiàn)場(chǎng)離奇詭異溢谤,居然都是意外死亡瞻凤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)世杀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阀参,“玉大人,你說(shuō)我怎么就攤上這事瞻坝≈肟牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵所刀,是天一觀的道長(zhǎng)衙荐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)浮创,這世上最難降的妖魔是什么忧吟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮斩披,結(jié)果婚禮上溜族,老公的妹妹穿的比我還像新娘。我一直安慰自己垦沉,他們只是感情好煌抒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著厕倍,像睡著了一般寡壮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天诬像,我揣著相機(jī)與錄音屋群,去河邊找鬼。 笑死坏挠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邪乍。 我是一名探鬼主播降狠,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼庇楞!你這毒婦竟也來(lái)了榜配?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吕晌,失蹤者是張志新(化名)和其女友劉穎蛋褥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體睛驳,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烙心,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乏沸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淫茵。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹬跃,靈堂內(nèi)的尸體忽然破棺而出匙瘪,到底是詐尸還是另有隱情,我是刑警寧澤蝶缀,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布丹喻,位于F島的核電站,受9級(jí)特大地震影響翁都,放射性物質(zhì)發(fā)生泄漏碍论。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一荐吵、第九天 我趴在偏房一處隱蔽的房頂上張望骑冗。 院中可真熱鬧,春花似錦先煎、人聲如沸贼涩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遥倦。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袒哥,已是汗流浹背缩筛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堡称,地道東北人瞎抛。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像却紧,于是被迫代替她去往敵國(guó)和親桐臊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354