Apache James數(shù)據(jù)庫(kù)存儲(chǔ)用戶信息的密碼加密問(wèn)題及解決方案
項(xiàng)目場(chǎng)景
Apache James郵件服務(wù)器使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)用戶信息的密碼加密問(wèn)題:
- 將James的用戶改為數(shù)據(jù)庫(kù)存儲(chǔ)
- James密碼是如何加密驗(yàn)證的
1.將James的用戶改為數(shù)據(jù)庫(kù)存儲(chǔ)
1、修改存儲(chǔ)方式
找到j(luò)ames-2.3.2\apps\james\SAR-INF\config.xml
找到<users-store>標(biāo)簽,注釋掉原來(lái)文件存儲(chǔ)的方式,改為數(shù)據(jù)庫(kù)的方式
maildb:是后面配置的數(shù)據(jù)源名稱
mail_users:是存儲(chǔ)用戶信息的表名
<users-store> <!-- 注釋掉原來(lái)文件存儲(chǔ)的方式 --> <!-- <repository name="LocalUsers" class="org.apache.james.userrepository.UsersFileRepository"> <destination URL="file://var/users/"/> </repository> --> <!-- 改為數(shù)據(jù)庫(kù)的方式 --> <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ù)庫(kù)信息
找到<data-source>標(biāo)簽,根據(jù)具體數(shù)據(jù)庫(kù)類型進(jìn)行配置,下面已國(guó)產(chǎn)達(dá)夢(mèng)數(shù)據(jù)庫(kù)為例
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、添加依賴包
因?yàn)槲矣玫氖沁_(dá)夢(mèng)數(shù)據(jù)庫(kù),james里面沒(méi)有這個(gè)數(shù)據(jù)庫(kù)的依賴包,所以需要額外添加,如果是mysql、oracle常用的數(shù)據(jù)庫(kù)就不需要再額外添加,因?yàn)閖ames已經(jīng)支持。
找到j(luò)ames-2.3.2\lib,然后把需要的依賴包放進(jìn)去
4、創(chuàng)建用戶表
正常情況下會(huì)自動(dòng)創(chuàng)建,sql語(yǔ)句在james-2.3.2\apps\james\conf\sqlResources.xml
如果不會(huì)自動(dòng)創(chuàng)建,那么自己把sql語(yǔ)句復(fù)制出來(lái)執(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 '加密方式,默認(rèn)SHA'; COMMENT ON COLUMN "MAIL_USERS"."PWDHASH" IS '加密后的密碼'; COMMENT ON COLUMN "MAIL_USERS"."USERNAME" IS '郵箱帳號(hào)';
2.James密碼是如何加密驗(yàn)證的
當(dāng)你通過(guò)telnet添加新用戶時(shí),比如add user test 123456,你可以查看數(shù)據(jù)庫(kù)中的記錄,username字段是test,pwdhash是加密后的密碼,pwdalgorithm字段是“SHA”,顯然用的是SHA加密方式。
讓我們看下james源碼是如何實(shí)現(xiàn)的,網(wǎng)上找到apache-james-2.3.2-src.zip源碼文件,版本根據(jù)自己的來(lái),然后用idea打開(kāi)。
我們找到org.apache.james.userrepository.DefaultUser類
第一個(gè)方法verifyPassword()是用來(lái)做密碼認(rèn)證,傳入的參數(shù)是明文密碼,通過(guò)DigestUtil.digestString()方法,轉(zhuǎn)換成密文密碼,然后與數(shù)據(jù)庫(kù)中密碼作比較,返回比較結(jié)果。請(qǐng)注意這里的DigestUtil.digestString()方法,在后面還在提到。
第二個(gè)方法setPassword()是用于密碼轉(zhuǎn)換的,把明文轉(zhuǎn)成密文,用的同樣是DigestUtil.digestString()方法。
讓我們?cè)倏聪?nbsp;org.apache.james.security.DigestUtil類,我們可以看到digestString加密的方法。
如果需要在自己的項(xiàng)目里去添加或修改用戶的信息,這時(shí)候密碼處理的邏輯肯定需要跟james一致,這時(shí)候我們把這個(gè)加密的方法拷貝用就行了 。
創(chuàng)建個(gè)DigestUtil類,然后調(diào)用DigestUtil.digestString()來(lái)獲得加密后的密碼。
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等 ,如果你想知道支持哪些算法,可以通過(guò)下面的代碼列出所有支持的算法:
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直接用明文帳號(hào)密碼連接就行了,因?yàn)閖ames會(huì)自己去加密驗(yàn)證,其他軟件通過(guò)pop3配置,密碼也是用明文就行了。
如果覺(jué)得這種連接方式不安全有兩種解決方案:
修改james源碼,比較麻煩。密碼在web端加密,傳輸?shù)阶约汉笈_(tái)再解密,然后用解密后的密碼連接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服務(wù)器地址 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ù)庫(kù)存儲(chǔ)用戶信息的密碼加密問(wèn)題的文章就介紹到這了,更多相關(guān)Apache James密碼加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VScode Remote SSH通過(guò)遠(yuǎn)程編輯與調(diào)試代碼
這篇文章主要介紹了VScode Remote SSH通過(guò)遠(yuǎn)程編輯與調(diào)試代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05如何實(shí)現(xiàn)連接一個(gè)Linux服務(wù)器
這篇文章主要介紹了如何實(shí)現(xiàn)連接一個(gè)Linux服務(wù)器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Ubuntu18.04一次性升級(jí)Python所有庫(kù)的方法步驟
這篇文章主要介紹了Ubuntu18.04一次性升級(jí)Python所有庫(kù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01linux下vsftpd的安裝及配置使用詳細(xì)步驟(推薦)
這篇文章主要介紹了linux下vsftpd的安裝及配置使用詳細(xì)步驟 ,需要的朋友可以參考下2018-01-01解讀Linux下ip命令展示的網(wǎng)絡(luò)連接信息
這篇文章主要給大家介紹了關(guān)于Linux下解讀ip命令展示的網(wǎng)絡(luò)連接信息的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2018-03-03linux實(shí)現(xiàn)定時(shí)備份mysql數(shù)據(jù)庫(kù)的簡(jiǎn)單方法
在本篇文章中我們給大家整理了一些關(guān)于linux實(shí)現(xiàn)定時(shí)備份mysql數(shù)據(jù)庫(kù)的簡(jiǎn)單方法,有需要的朋友們可以學(xué)習(xí)下。2018-09-09