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

Apache James數(shù)據(jù)庫存儲用戶信息的密碼加密問題及解決方案

 更新時間:2024年03月28日 11:09:24   作者:濤哥是個大帥比  
集成java mail直接用明文帳號密碼連接就行了,因為james會自己去加密驗證,其他軟件通過pop3配置,密碼也是用明文就行了,這篇文章主要介紹了Apache James數(shù)據(jù)庫存儲用戶信息的密碼加密問題及解決方案,需要的朋友可以參考下

項目場景

Apache James郵件服務器使用數(shù)據(jù)庫來存儲用戶信息的密碼加密問題:

  • 將James的用戶改為數(shù)據(jù)庫存儲
  • James密碼是如何加密驗證的

1.將James的用戶改為數(shù)據(jù)庫存儲

1、修改存儲方式

找到james-2.3.2\apps\james\SAR-INF\config.xml

找到<users-store>標簽,注釋掉原來文件存儲的方式,改為數(shù)據(jù)庫的方式

maildb:是后面配置的數(shù)據(jù)源名稱

mail_users:是存儲用戶信息的表名

<users-store>
  <!-- 注釋掉原來文件存儲的方式 -->
  <!--
  <repository name="LocalUsers" class="org.apache.james.userrepository.UsersFileRepository">
	 <destination URL="file://var/users/"/>
  </repository>
	 -->
  <!-- 改為數(shù)據(jù)庫的方式 -->
  <repository name="LocalUsers" class="org.apache.james.userrepository.JamesUsersJdbcRepository" destinationURL="db://maildb/mail_users">
	 <sqlFile>file://conf/sqlResources.xml</sqlFile>
  </repository>
</users-store>

 2.、配置數(shù)據(jù)庫信息

找到<data-source>標簽,根據(jù)具體數(shù)據(jù)庫類型進行配置,下面已國產(chǎn)達夢數(shù)據(jù)庫為例

maildb:數(shù)據(jù)源名稱 

<data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource">
	<driver>dm.jdbc.driver.DmDriver</driver>
	<dburl>jdbc:dm://127.0.0.1:5236/test_mail</dburl>
		<user>test</user>
	<password>test123</password>
	<max>50</max>
</data-source>

3、添加依賴包

因為我用的是達夢數(shù)據(jù)庫,james里面沒有這個數(shù)據(jù)庫的依賴包,所以需要額外添加,如果是mysql、oracle常用的數(shù)據(jù)庫就不需要再額外添加,因為james已經(jīng)支持。

找到james-2.3.2\lib,然后把需要的依賴包放進去

4、創(chuàng)建用戶表

正常情況下會自動創(chuàng)建,sql語句在james-2.3.2\apps\james\conf\sqlResources.xml

如果不會自動創(chuàng)建,那么自己把sql語句復制出來執(zhí)行

CREATE TABLE "MAIL_USERS"
(
	"USERNAME" VARCHAR2(64) NOT NULL,
	"PWDHASH" VARCHAR2(50),
	"PWDALGORITHM" VARCHAR2(20),
	"USEFORWARDING" NUMBER(1,0),
	"FORWARDDESTINATION" VARCHAR2(255),
	"USEALIAS" NUMBER(1,0),
	"ALIAS" VARCHAR2(255),
	PRIMARY KEY("USERNAME")
);
COMMENT ON TABLE "MAIL_USERS" IS 'James郵件用戶';
COMMENT ON COLUMN "MAIL_USERS"."PWDALGORITHM" IS '加密方式,默認SHA';
COMMENT ON COLUMN "MAIL_USERS"."PWDHASH" IS '加密后的密碼';
COMMENT ON COLUMN "MAIL_USERS"."USERNAME" IS '郵箱帳號';

 2.James密碼是如何加密驗證的

        當你通過telnet添加新用戶時,比如add user test 123456,你可以查看數(shù)據(jù)庫中的記錄,username字段是test,pwdhash是加密后的密碼,pwdalgorithm字段是“SHA”,顯然用的是SHA加密方式。

        讓我們看下james源碼是如何實現(xiàn)的,網(wǎng)上找到apache-james-2.3.2-src.zip源碼文件,版本根據(jù)自己的來,然后用idea打開。

        我們找到org.apache.james.userrepository.DefaultUser類

        第一個方法verifyPassword()是用來做密碼認證,傳入的參數(shù)是明文密碼,通過DigestUtil.digestString()方法,轉(zhuǎn)換成密文密碼,然后與數(shù)據(jù)庫中密碼作比較,返回比較結(jié)果。請注意這里的DigestUtil.digestString()方法,在后面還在提到。

        第二個方法setPassword()是用于密碼轉(zhuǎn)換的,把明文轉(zhuǎn)成密文,用的同樣是DigestUtil.digestString()方法。

        讓我們再看下 org.apache.james.security.DigestUtil類,我們可以看到digestString加密的方法。

        如果需要在自己的項目里去添加或修改用戶的信息,這時候密碼處理的邏輯肯定需要跟james一致,這時候我們把這個加密的方法拷貝用就行了 。

        創(chuàng)建個DigestUtil類,然后調(diào)用DigestUtil.digestString()來獲得加密后的密碼。

package com.mail;
import javax.mail.MessagingException;
import javax.mail.internet.MimeUtility;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class DigestUtil {
    public static String digestString(String pass, String algorithm )
            throws NoSuchAlgorithmException  {
        MessageDigest md;
        ByteArrayOutputStream bos;
        try {
            md = MessageDigest.getInstance(algorithm);
            byte[] digest = md.digest(pass.getBytes("iso-8859-1"));
            bos = new ByteArrayOutputStream();
            OutputStream encodedStream = MimeUtility.encode(bos, "base64");
            encodedStream.write(digest);
            return bos.toString("iso-8859-1");
        } catch (IOException ioe) {
            throw new RuntimeException("Fatal error: " + ioe);
        } catch (MessagingException me) {
            throw new RuntimeException("Fatal error: " + me);
        }
    }
    private DigestUtil() {}
}

        加密支持的算法有MD5、SHA、SHA-256等 ,如果你想知道支持哪些算法,可以通過下面的代碼列出所有支持的算法:

import java.security.Security;
import java.security.Provider;
import java.security.Provider.Service;
public class ListAlgorithms {
    public static void main(String[] args) {
        for(Provider provider: Security.getProviders()) {
            for(Service service: provider.getServices()) {
                if ("MessageDigest".equals(service.getType())) {
                    System.out.println(service.getAlgorithm());
                }
            }
        }
    }
}

3.總結(jié)

        集成java mail直接用明文帳號密碼連接就行了,因為james會自己去加密驗證,其他軟件通過pop3配置,密碼也是用明文就行了。

        如果覺得這種連接方式不安全有兩種解決方案:

修改james源碼,比較麻煩。密碼在web端加密,傳輸?shù)阶约汉笈_再解密,然后用解密后的密碼連接james。
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
public class SendEmail {
    public static void main(String[] args) {
        String host = "smtp.example.com"; // SMTP服務器地址
        String username = "your-username"; // 用戶名
        String password = "your-password"; // 密碼
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });
        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("from@example.com"));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@example.com"));
            message.setSubject("Email Subject");
            message.setText("Email Body");
            Transport.send(message);
            System.out.println("Email sent successfully");
        } catch (MessagingException e) {
            throw new RuntimeException("Error sending email", e);
        }
    }
}

到此這篇關(guān)于Apache James數(shù)據(jù)庫存儲用戶信息的密碼加密問題的文章就介紹到這了,更多相關(guān)Apache James密碼加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何在CentOS8上安裝和配置Postfix郵件服務器的方法示例

    如何在CentOS8上安裝和配置Postfix郵件服務器的方法示例

    這篇文章主要介紹了如何在CentOS8上安裝和配置Postfix郵件服務器的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 實時Linux的音頻實時監(jiān)控系統(tǒng)實踐過程

    實時Linux的音頻實時監(jiān)控系統(tǒng)實踐過程

    基于實時Linux的音頻監(jiān)控系統(tǒng)通過實時任務調(diào)度、PCM/ALSA/FFT技術(shù)實現(xiàn)安全、工業(yè)等領(lǐng)域的實時采集與分析,提升效率與安全性,減少故障風險,適用于物聯(lián)網(wǎng)、自動化場景,結(jié)合機器學習可增強分析能力,(80字)
    2025-08-08
  • linux安裝jenkins全過程

    linux安裝jenkins全過程

    本文介紹了在CentOS上安裝Jenkins的過程,包括導入yum源、安裝Jenkins、初次訪問、常用配置等內(nèi)容,文章還提供了修改Jenkins端口、切換默認用戶、配置Git和Maven的詳細步驟
    2026-04-04
  • ollama升級后局域網(wǎng)無法訪問的解決過程

    ollama升級后局域網(wǎng)無法訪問的解決過程

    文章講述了在升級ollama到最新版本后,通過局域網(wǎng)IP無法外部訪問的問題,通過檢查服務文件并添加監(jiān)聽所有網(wǎng)絡接口的配置,問題得到解決
    2026-01-01
  • Linux下查看binlog文件創(chuàng)建時間的命令

    Linux下查看binlog文件創(chuàng)建時間的命令

    這篇文章主要介紹了Linux下查看binlog文件創(chuàng)建時間的命令,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • 教大家?guī)追N在Linux系統(tǒng)中查看時區(qū)的方法

    教大家?guī)追N在Linux系統(tǒng)中查看時區(qū)的方法

    Linux 包含多種可用的時間管理工具,比如 date 或 timedatectlcommands,你可以用它們來獲取當前系統(tǒng)時區(qū),也可以將系統(tǒng)時間與 NTP 服務器同步,來自動地、更精確地進行時間管理。下面通過這篇文章來一起看看在Linux系統(tǒng)中查看時區(qū)的幾種不同方法。
    2017-01-01
  • centos7系統(tǒng)下搭建docker本地鏡像倉庫的方法

    centos7系統(tǒng)下搭建docker本地鏡像倉庫的方法

    本篇文章主要介紹了CentOS 7 : Docker私有倉庫搭建和使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Linux 系統(tǒng)優(yōu)化的一些建議(內(nèi)核優(yōu)化)

    Linux 系統(tǒng)優(yōu)化的一些建議(內(nèi)核優(yōu)化)

    這篇文章主要介紹了Linux 系統(tǒng)優(yōu)化的一些建議,幫助大家更好的使用Linux,感興趣的朋友可以了解下
    2020-08-08
  • 超詳細講解Linux C++多線程同步的方式

    超詳細講解Linux C++多線程同步的方式

    這篇文章主要介紹了Linux C++多線程同步的方式,文中通過示例和代碼講解的非常詳細,對正在學習該內(nèi)容的朋友有很大的幫助,感興趣的小伙伴可以參考參考
    2021-08-08
  • JVM上高性能數(shù)據(jù)格式庫包Apache Arrow入門和架構(gòu)詳解(Gkatziouras)

    JVM上高性能數(shù)據(jù)格式庫包Apache Arrow入門和架構(gòu)詳解(Gkatziouras)

    Apache Arrow是是各種大數(shù)據(jù)工具(包括BigQuery)使用的一種流行格式,它是平面和分層數(shù)據(jù)的存儲格式,今天給大家介紹JVM上高性能數(shù)據(jù)格式庫包Apache Arrow入門和架構(gòu)介紹,感興趣的朋友一起看看吧
    2021-05-05

最新評論

揭西县| 景德镇市| 兖州市| 务川| 双城市| 即墨市| 洮南市| 梅河口市| 丹江口市| 资溪县| 宁远县| 清河县| 中江县| 天台县| 喀什市| 阳朔县| 白城市| 仙桃市| 乐业县| 呼玛县| 四会市| 罗江县| 杨浦区| 常山县| 吴旗县| 洮南市| 友谊县| 句容市| 马尔康县| 青铜峡市| 胶州市| 连云港市| 安图县| 清水河县| 怀柔区| 宁蒗| 泰来县| 清河县| 永登县| 格尔木市| 大连市|