From d24ece60fd6c104d42e0cc7d7c9b73c5c9fd03d9 Mon Sep 17 00:00:00 2001 From: heyethereum Date: Sat, 17 Aug 2024 10:43:59 +0800 Subject: [PATCH] implemented keyword search in sms --- .../safeqr/app/qrcode/entity/SMSEntity.java | 5 ++ .../com/safeqr/app/qrcode/model/SMSModel.java | 2 +- .../service/SMSVerificationService.java | 56 ++++++++++++++++++- 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/safeqr/app/qrcode/entity/SMSEntity.java b/src/main/java/com/safeqr/app/qrcode/entity/SMSEntity.java index 38a9693..4e336c9 100644 --- a/src/main/java/com/safeqr/app/qrcode/entity/SMSEntity.java +++ b/src/main/java/com/safeqr/app/qrcode/entity/SMSEntity.java @@ -2,6 +2,7 @@ package com.safeqr.app.qrcode.entity; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; @@ -31,4 +32,8 @@ public class SMSEntity { private String phone; private String message; + + @JsonInclude(JsonInclude.Include.NON_NULL) + @Column(name = "keyword_detected") + private String keywordDetected; } diff --git a/src/main/java/com/safeqr/app/qrcode/model/SMSModel.java b/src/main/java/com/safeqr/app/qrcode/model/SMSModel.java index 9b020db..12f8d00 100644 --- a/src/main/java/com/safeqr/app/qrcode/model/SMSModel.java +++ b/src/main/java/com/safeqr/app/qrcode/model/SMSModel.java @@ -38,6 +38,6 @@ public final class SMSModel extends QRCodeModel { } @Override public String retrieveClassification() { - return ""; + return smsVerificationService.getClassification(details); } } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/service/SMSVerificationService.java b/src/main/java/com/safeqr/app/qrcode/service/SMSVerificationService.java index c55fe7e..3e72015 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/SMSVerificationService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/SMSVerificationService.java @@ -8,14 +8,44 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; +import java.util.*; + +import static com.safeqr.app.constants.CommonConstants.CLASSIFY_SAFE; +import static com.safeqr.app.constants.CommonConstants.CLASSIFY_WARNING; @Service public class SMSVerificationService { private final SMSRepository smsRepository; private static final Logger logger = LoggerFactory.getLogger(SMSVerificationService.class); + // Define phishing keywords categories + private static final Map> PHISHING_KEYWORDS_MAP = new HashMap<>(); + + static { + PHISHING_KEYWORDS_MAP.put("Generic", Arrays.asList("password", "verify", "urgent", "prize", "account update")); + PHISHING_KEYWORDS_MAP.put("Tax Refund", Arrays.asList("tax refund", "claim your refund", "tax return")); + PHISHING_KEYWORDS_MAP.put("Suspicious Activity", Arrays.asList("suspicious activity detected", "action required", "account compromised")); + PHISHING_KEYWORDS_MAP.put("Social Media", Arrays.asList("social media account", "unauthorized login attempt", "verify your account")); + PHISHING_KEYWORDS_MAP.put("Bogus Payment", Arrays.asList("payment confirmation", "transaction details", "payment receipt")); + PHISHING_KEYWORDS_MAP.put("Incorrect Billing", Arrays.asList("incorrect billing information", "update billing details", "billing account")); + PHISHING_KEYWORDS_MAP.put("iCloud", Arrays.asList("icloud account", "update your icloud", "icloud security alert")); + PHISHING_KEYWORDS_MAP.put("HR Survey", Arrays.asList("human resources survey", "employee feedback", "survey participation")); + PHISHING_KEYWORDS_MAP.put("Google Docs", Arrays.asList("google docs", "view shared document", "google drive")); + PHISHING_KEYWORDS_MAP.put("USPS", Arrays.asList("usps delivery", "package tracking", "shipping details")); + PHISHING_KEYWORDS_MAP.put("Voicemail", Arrays.asList("voicemail notification", "missed call", "listen to voicemail")); + PHISHING_KEYWORDS_MAP.put("Bogus Invoice", Arrays.asList("invoice details", "view invoice", "payment invoice")); + PHISHING_KEYWORDS_MAP.put("Email Upgrade", Arrays.asList("email account upgrade", "email settings update", "upgrade your email")); + PHISHING_KEYWORDS_MAP.put("Dropbox", Arrays.asList("dropbox", "view shared file", "dropbox account")); + PHISHING_KEYWORDS_MAP.put("CEO Phishing", Arrays.asList("ceo email", "urgent message from ceo", "ceo authorization")); + PHISHING_KEYWORDS_MAP.put("Costco", Arrays.asList("costco", "costco membership", "costco rewards")); + PHISHING_KEYWORDS_MAP.put("Bank", Arrays.asList("bank account", "unusual activity", "account login")); + PHISHING_KEYWORDS_MAP.put("Fake App", Arrays.asList("app purchase", "app subscription", "confirm your purchase")); + PHISHING_KEYWORDS_MAP.put("Advanced Fee", Arrays.asList("advance fee", "processing fee", "fee payment")); + PHISHING_KEYWORDS_MAP.put("Account Suspension", Arrays.asList("account suspension", "suspend your account", "account deactivation")); + } + @Autowired public SMSVerificationService(SMSRepository smsRepository) { this.smsRepository = smsRepository; @@ -54,5 +84,29 @@ public class SMSVerificationService { throw new InvalidFormatExceptions("Invalid SMSTO format. Expected format: SMSTO::"); } } + @Transactional + public String getClassification (SMSEntity smsEntity) { + + String lowerCaseSms = smsEntity.getMessage().toLowerCase(); + logger.info("Sms: {}", lowerCaseSms); + + // Iterate over the map of phishing keywords + for (Map.Entry> entry : PHISHING_KEYWORDS_MAP.entrySet()) { + String category = entry.getKey(); + List keywords = entry.getValue(); + + // Check if the SMS contains any of the phishing keywords + for (String keyword : keywords) { + if (lowerCaseSms.contains(keyword)) { + logger.info("Phishing keyword detected: {}", keyword); + smsEntity.setKeywordDetected("Potential Phishing - " + category); + return CLASSIFY_WARNING; + } + } + } + + // If no phishing keywords are found + return CLASSIFY_SAFE; + } } \ No newline at end of file