簡訊驗證碼登錄你會嗎?

2021-02-07 java後端指南
文章首推今日主題:簡訊驗證碼登錄簡介

相信大家在很多網站進行登錄的時候,都見過簡訊驗證碼登錄吧,那現在就來看看怎麼實現吧

原理說明

首先我們需要一個簡訊發送接口,前端發送手機號碼到後端,後端隨機生成一個驗證碼並存入redis,並且設置該key的過期時間,然後就是校驗了,發送手機號碼和驗證碼到後臺,從redis中取出對應的驗證碼就行校驗,如果正確就把該驗證碼刪掉,防止可以驗證多次

環境實現過程

1、創建簡訊模板和簡訊籤名3、創建AccessKeyId4、創建一個springboot工程,導入坐標

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--阿里雲簡訊驗證碼-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.0.6</version> <!-- 註:如提示報錯,先升級基礎包版,無法解決可聯繫技術支持 -->
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.1.0</version>
        </dependency>
        <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- 添加jedis客戶端 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <!--spring2.0集成redis所需common-pool2-->
        <!-- 必須加上,jedis依賴此  -->
        <!-- spring boot 2.0 的操作手冊有標註 大家可以去看看 地址是:https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.5.0</version>
        </dependency>

        <!-- 將作為Redis對象序列化器 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

5、yml文件配置redis

# redis配置
spring:
  redis:
    # Redis資料庫索引(默認為0)
    database: 0
    # Redis伺服器地址
    host: 127.0.0.1
    # Redis伺服器連接埠
    port: 6379
    # Redis伺服器連接密碼(默認為空)
    password:
    jedis:
      pool:
        # 連接池最大連接數(使用負值表示沒有限制)
        max-active: 20
        # 連接池最大阻塞等待時間(使用負值表示沒有限制)
        max-wait: -1
        # 連接池中的最大空閒連接
        max-idle: 10
        # 連接池中的最小空閒連接
        min-idle: 0
    # 連接超時時間(毫秒)
    timeout: 1000

6、進行redis配置

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

//    /**
//     * springboot1.x用這個來管理緩存
//     * 選擇redis作為默認緩存工具
//     * @param redisTemplate
//     * @return
//     */
//    @Bean
//    public CacheManager cacheManager(RedisTemplate redisTemplate) {
//        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
//        return rcm;
//    }



    /**
     * Logger
     */
    private static final Logger lg = LoggerFactory.getLogger(RedisConfiguration.class);


    @Autowired
    private JedisConnectionFactory jedisConnectionFactory;

    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        //  設置自動key的生成規則,配置spring boot的註解,進行方法級別的緩存
        // 使用:進行分割,可以很多顯示出層級關係
        // 這裡其實就是new了一個KeyGenerator對象,只是這是lambda表達式的寫法,我感覺很好用,大家感興趣可以去了解下
        return (target, method, params) -> {
            StringBuilder sb = new StringBuilder();
            sb.append(target.getClass().getName());
            sb.append(":");
            sb.append(method.getName());
            for (Object obj : params) {
                sb.append(":" + String.valueOf(obj));
            }
            String rsToUse = String.valueOf(sb);
            lg.info("自動生成Redis Key -> [{}]", rsToUse);
            return rsToUse;
        };
    }

    @Bean
    @Override
    public CacheManager cacheManager() {
        // 初始化緩存管理器,在這裡我們可以緩存的整體過期時間什麼的,我這裡默認沒有配置
        lg.info("初始化 -> [{}]", "CacheManager RedisCacheManager Start");
        RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager
                .RedisCacheManagerBuilder
                .fromConnectionFactory(jedisConnectionFactory);
        return builder.build();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory ) {
        //設置序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置redisTemplate
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer); // key序列化
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value序列化
        redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); // Hash value序列化
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    @Override
    @Bean
    public CacheErrorHandler errorHandler() {
        // 異常處理,當Redis發生異常時,列印日誌,但是程序正常走
        lg.info("初始化 -> [{}]", "Redis CacheErrorHandler");
        CacheErrorHandler cacheErrorHandler = new CacheErrorHandler() {
            @Override
            public void handleCacheGetError(RuntimeException e, Cache cache, Object key) {
                lg.error("Redis occur handleCacheGetError:key -> [{}]", key, e);
            }

            @Override
            public void handleCachePutError(RuntimeException e, Cache cache, Object key, Object value) {
                lg.error("Redis occur handleCachePutError:key -> [{}];value -> [{}]", key, value, e);
            }

            @Override
            public void handleCacheEvictError(RuntimeException e, Cache cache, Object key)    {
                lg.error("Redis occur handleCacheEvictError:key -> [{}]", key, e);
            }

            @Override
            public void handleCacheClearError(RuntimeException e, Cache cache) {
                lg.error("Redis occur handleCacheClearError:", e);
            }
        };
        return cacheErrorHandler;
    }

    /**
     * 此內部類就是把yml的配置數據,進行讀取,創建JedisConnectionFactory和JedisPool,以供外部類初始化緩存管理器使用
     * 不了解的同學可以去看@ConfigurationProperties和@Value的作用
     *
     */
    @ConfigurationProperties
    class DataJedisProperties{
        @Value("${spring.redis.host}")
        private  String host;
        @Value("${spring.redis.password}")
        private  String password;
        @Value("${spring.redis.port}")
        private  int port;
        @Value("${spring.redis.timeout}")
        private  int timeout;
        @Value("${spring.redis.jedis.pool.max-idle}")
        private int maxIdle;
        @Value("${spring.redis.jedis.pool.max-wait}")
        private long maxWaitMillis;

        @Bean
        JedisConnectionFactory jedisConnectionFactory() {
            lg.info("Create JedisConnectionFactory successful");
            JedisConnectionFactory factory = new JedisConnectionFactory();
            factory.setHostName(host);
            factory.setPort(port);
            factory.setTimeout(timeout);
            factory.setPassword(password);
            return factory;
        }
        @Bean
        public JedisPool redisPoolFactory() {
            lg.info("JedisPool init successful,host -> [{}];port -> [{}]", host, port);
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxIdle(maxIdle);
            jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);

            JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
            return jedisPool;
        }
    }
}

7、創建發送簡訊的工具類:


/**
 * 發送簡訊工具類
 */
public class SendSMSUtil {
    /**
     * 你的accessKeyId
     */
    private static final String accessKeyId="";
    /**
     * 你的accessKeySecret
     */
    private static final String accessKeySecret="";
    /**
     * 籤名
     */
    private static final String signName="";
    /**
     * 簡訊模板
     */
    private static final String templateCode="";
    /**
     * 驗證碼
     */
    private static int code;

    /**
     * @Descirption:發送手機驗證碼
     * @param phoneNumber:需要發送的手機號碼
     * @return OK表示成功,失敗則返回失敗消息
     */
    public static String sendSmsUtil(String phoneNumber){
        //設置超時時間-可自行調整
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");

        // 初始化ascClient需要的幾個參數

        // 簡訊API產品名稱(簡訊產品名固定,無需修改)
        final String product = "Dysmsapi";
        // 簡訊API產品域名(接口地址固定,無需修改)
        final String domain = "dysmsapi.aliyuncs.com";

        // 初始化ascClient,暫時不支持多region(請勿修改)
        IClientProfile profile= DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        try {
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        } catch (ClientException e) {
            e.printStackTrace();
        }
        IAcsClient acsClient=new DefaultAcsClient(profile);

        // 組裝請求對象
        SendSmsRequest request=new SendSmsRequest();
        //使用post提交
        request.setMethod(MethodType.POST);

        // 必填:待發送手機號。支持以逗號分隔的形式進行批量調用,批量上限為1000個手機號碼,批量調用相對於單條調用及時性稍有延遲,
        // 驗證碼類型的簡訊推薦使用單條調用的方式;發送國際/港澳臺消息時,接收號碼格式為國際區號+號碼,如「85200000000」
        request.setPhoneNumbers(phoneNumber);
        request.setSignName(signName);
        // 必填:簡訊模板-可在簡訊控制臺中找到,發送國際/港澳臺消息時,請使用國際/港澳臺簡訊模版
        request.setTemplateCode(templateCode);

        //隨機生成6位驗證碼
        code = (int) ((Math.random() * 9 + 1) * 100000);

        // 可選:模板中的變量替換JSON串,如模板內容為"親愛的${name},您的驗證碼為${code}"時,此處的值為
        // 友情提示:如果JSON中需要帶換行符,請參照標準的JSON協議對換行符的要求,比如簡訊內容中包含\r\n的情況在JSON中需要表示成\\r\\n,否則會導致JSON在服務端解析失敗
        request.setTemplateParam("{code:"+code+"}");

        // 請求失敗這裡會拋ClientException異常
        SendSmsResponse sendSmsResponse = null;

        try {
            sendSmsResponse = acsClient.getAcsResponse(request);
        } catch (ClientException e) {
            e.printStackTrace();
            return "請求失敗";
        }

        assert sendSmsResponse.getCode() != null;
        // 發送不成功
        if (sendSmsResponse.getCode() == null || !sendSmsResponse.getCode().equals("OK")) {
            return sendSmsResponse.getMessage();
        }

        // 請求成功
        return "OK";
    }

    public static int getCode(){
        return code;
    }
}

8、創建控制類

@Controller
//跨域使用
@CrossOrigin
public class SmsController {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    /**
     * 發送手機驗證碼
     * @param phoneNumber 手機號碼
     * @return 1表示成功,0表示失敗
     */
    @RequestMapping("/sendSms")
    @ResponseBody
    public String SmsTest(String phoneNumber){
        //發送簡訊
        String result = SendSMSUtil.sendSmsUtil(phoneNumber);


        if (result == null || !result.equals("OK")) {// 發送不成功
            return "0";
        }

        // 獲取驗證碼
        int code = SendSMSUtil.getCode();
        Map<String,Object> map=new HashMap<>();
        // 將數據存入redis
        map.put(phoneNumber,code+"");
        //用phoneNumber來做鍵,可以做到唯一性
        stringRedisTemplate.opsForHash().putAll(phoneNumber,map);
        // 設置redis過期時間,這個時間是秒為單位的,我現在設置5分鐘之內有效,過了就會自動刪除
        stringRedisTemplate.expire(phoneNumber, 60*5, TimeUnit.SECONDS);

        return "OK";

    }
 /**
     * 校驗驗證碼
     * @param phoneNumber
     * @param checkSMSCode
     * @return
     */
    @RequestMapping(value = "/checkSMSCode", method = RequestMethod.POST)
    @ResponseBody
    public String checkSMSCode(String phoneNumber,String checkSMSCode) {

        // 伺服器放入的驗證碼
        Map<Object, Object> map=stringRedisTemplate.opsForHash().entries(phoneNumber);
        String serverCheckCode =(String) map.get(phoneNumber);


        if (serverCheckCode == null || serverCheckCode.equals("")) {
            return "CodeError";
        }
        // 驗證碼不匹配
        if (!checkSMSCode.equals(serverCheckCode)) {
            return "CodeError";
        }else {
            //如果驗證成功就刪除驗證碼
            stringRedisTemplate.opsForHash().delete(phoneNumber,phoneNumber);
        }


        return "OK";

    }

}

9、自己寫個前端頁面,或者用postman 來測試

我這裡還有點瑕疵,前端點擊發送之後,要有倒計時,並且後端要有時間限制,比如1分鐘之內不可以重複發送驗證碼,這都是小問題,大家可以自己去寫一個判斷

相關焦點

  • 你知道怎麼預防簡訊驗證碼被別人盜用嗎?
    我們在手機上收不到手機驗證碼簡訊時,可能是因為驗證碼簡訊被盜用了,那麼簡訊驗證碼是如何被盜用的、它有哪些危害、應當如何預防用戶驗證碼簡訊被盜用。今天小編就為你說明簡訊驗證碼被盜用的問題。#簡訊防火牆#用戶在使用手機時,如果不小心點擊了某一個不知名的網頁連結或者下載了一個不知名的產品軟體,就有可能會使自己的手機感染木馬病毒,那麼自己在需要手機簡訊驗證碼來登錄帳號時可能就接收不到簡訊驗證碼信息了。
  • 支付寶用簡訊驗證碼就能改密碼,如果手機丟了,帳號還安全嗎?
    支付寶用簡訊驗證碼就能改密碼,如果手機丟了,帳號還安全嗎?隨著網際網路的發展,行動支付已經成為了我們生活中密不可分的一部分,也是在生活當中,行動支付軟體已經成為了很多人手機中必備的存在。而在眾多行動支付軟體當中,支付寶可以說是最受大家歡迎的存在,只是對於支付寶,相信很多小夥伴都會有這樣疑問:支付寶只需要簡訊驗證碼就可以輕易更改登錄密碼,那麼假如我們手機丟了,帳號還安全嗎?我們知道,更改支付寶帳號的登錄密碼其實很簡單,只需要一個簡訊驗證碼就可以了,那麼假如我們的手機丟了,支付寶帳號還安全嗎?帳號裡面的錢會丟失多少呢?
  • 莫名收到簡訊驗證碼?小心!
    甚至網上銀行APP登錄帳號和密碼也已被篡改,損失慘重。具體來說是這樣的:一、騙子通過特種設備自動搜索附近的手機號碼,用你的號碼登錄一些網站或應用,然後用「簡訊嗅探技術」攔截這些網站、應用發給你的驗證碼。
  • 再見,簡訊驗證碼!
    由於家裡信號不太好,找回密碼是需要簡訊驗證碼的,結果跑去陽臺等了特麼的十幾分鐘還是收不到驗證碼的心情你們可以理解嗎?當時就有一種 MLGB 砸了這個手機的心情!反正基本上都是不發則已,一發驚人呀!叮叮叮來一串兒,我人氣怎麼那麼高呢?一看全是驗證碼...你想讓我怎樣?按照這個尿性,猴年馬月才能拿回我的微信啊!
  • 手機簡訊驗證碼真的安全嗎?
    如今手機綁定最主要的表現方式就是通過簡訊驗證碼來證明自己的身份,驗證的方式極其簡單便捷,當人們在享受這份簡單便捷的驗證方式時,不由也為簡訊驗證碼來驗證身份信息的方式產生了不信任感。 那麼手機簡訊驗證碼真的安全嗎?  如果說安全的話,沒有什麼是真正的安全的,簡訊驗證碼也不是最安全的驗證身份的方法。
  • 焦點訪談:莫名其妙收到簡訊驗證碼?小心被盜刷!
    2019年7月4日凌晨3點多,海南省三亞市宋女士的手機上突然收到了幾條簡訊驗證碼,不一會兒手機又接到簡訊,顯示她的銀行卡被刷走了5萬元。在銀行卡上的錢被轉走之前,宋女士有沒有進行什麼操作呢?有沒有什麼可疑的事情發生呢?受害人宋女士說:「沒有任何操作,問你的身份證,你的銀行卡密碼,根本就沒有,根本不用我操作。」
  • 簡訊驗證碼如此不安全!蘋果雙重驗證好太多
    這家公司的伺服器缺乏密碼保護,給了他人幾乎能窺探實時簡訊流的機會。數據顯示,VoxOx的伺服器上已有超過2600萬條簡訊。調查人員在洩露出的簡訊數據中發現了booking.com、谷歌和至少兩家金融服務公司的2FA(雙重驗證)代碼。簡訊驗證碼的弊端通過簡訊接收驗證碼,是國內外用戶常用的一種雙重驗證途徑。
  • 你的簡訊驗證碼正在被販賣
    廣州日報記者今天從高州市獲悉,今年7月,高州市公安局網警大隊在茂名網警支隊大力支撐下,成功打掉一個利用「接碼平臺」為黑色產業人員提供手機號及簡訊驗證碼獲利的團夥,抓獲嫌疑人4名、繳獲「貓池」1臺、作案電腦5臺、手機6臺、已實名註冊手機卡800多張。
  • 求職要求發驗證碼?他拒絕後,每隔幾秒鐘就會收到一條簡訊
    讓吳先生沒想到的是,有一家公司聯繫了他之後,要求他發送一個驗證碼。由於不知道對方需要驗證碼做什麼用途,吳先生予以了拒絕。不過,接下來發生的事情,讓吳先生不堪其擾。 吳先生告訴630-第1眼記者,簡訊的內容全是各個網站的驗證碼,有「豐巢快遞、偉東學堂、快手」。從昨天晚上到今天凌晨五六點,他的手機每隔幾秒鐘就會收到一條。
  • 索要簡訊驗證碼的,100%是詐騙!
    索要簡訊驗證碼的,100%是詐騙! 「7月31日8:00至8月1日8:00今日全市共接電信網絡詐騙警情1起鹽池縣1起(索要驗證碼
  • 簡訊驗證碼絕對安全嗎?
    不久前,我們介紹了和手機 SIM 卡相關的內容,而作為產生時間很久的手機號碼,關於它的各種內容,你都了解嗎?◆  ◆  ◆  ◆  ◆  驗證碼是絕對安全的嗎?驗證碼是我們再熟悉不過的一個東西了,註冊各類帳號、進行大額支付、安全驗證等,手機簡訊驗證碼都是一個必備的東西。
  • 央視315曝光超50個App竊取隱私,包括簡訊驗證碼
    晚會爆料以下50多款安卓應用可能在用戶不知情的情況下,偷偷閱讀並上傳用戶簡訊內容,包括網絡交易驗證碼等。這是相關技術人員在2019年11月調查時獲取的數據,部分軟體版本應該升級了,可能問題也修復了,保險起見我建議還是全部卸載吧,理由我後面會說。
  • 淪為驗證碼工具的簡訊,馬上重大升級!訂票訂座聊天很簡單,微信該不...
    而曾經承載了多少人情思妙語的簡訊,近年來卻徹底淪落為收驗證碼的工具。更不要提越來越多的垃圾簡訊,許多人連手機的簡訊界面都不想打開。但是隨著5G技術的發展,沉寂已久的簡訊也看到了曙光。圖片來源:攝圖網想像一下,以後你要訂火車票、訂外賣、訂酒店,再也不用下載一堆App,記一堆帳號密碼、收一串驗證碼,而是只需要發送一條幾個字的簡訊,就能快捷實現預訂、支付、改籤等操作,與此同時,還支持加密傳輸、圖形密碼,再也不用自己的個人信息洩露,這時候,你是選擇App,還是簡訊?
  • 蘋果手機雙重認證關閉收不到驗證碼怎麼辦
    首次登錄一部新設備時,您需要提供兩種信息:您的密碼和自動顯示在您的受信任設備上的六位驗證碼。輸入驗證碼後,您即確認您信任這部新設備。例如,如果您有一部 iPhone 並且要在新購的 Mac 上首次登錄您的帳戶,您將收到提示信息,要求您輸入密碼和自動顯示在您 iPhone 上的驗證碼。
  • 收不到驗證碼?你的手機可能被控制了!全國超500萬隻手機中招
    今天雖然我們與人交流的時候很少使用簡訊了,畢竟有很多其他的即時通訊工具,但是手機簡訊還有一個重大的作用,那就是收驗證碼。這是一個非常安全的驗證方式,我們到各個網站去註冊會員,我們使用手機銀行的服務,幾乎各大網站都會利用手機驗證碼來驗證你是本人操作。可是大家有沒有想到?
  • 淨網2020 驗證碼保密級別堪比密碼 千萬不要隨意洩露!
    驗證碼保密級別堪比密碼 千萬不要隨意洩露!在虛擬的網絡世界中,能證明你自己身份的證據就是你的手機號、你的郵箱、你的密碼、你的驗證碼,當騙子掌握了這一切,騙子就變成了「你」。小劉在下班回家的路上收到了一條雜誌樣刊的簡訊。他下意識的回覆「退訂」,卻被告知指令不正確。
  • 央視:手機驗證碼已被騙子利用轉空銀行卡
    2019年7月4日凌晨3點多,海南省三亞市宋女士的手機上突然收到了幾條簡訊驗證碼,不一會兒手機又接到簡訊,顯示她的銀行卡被刷走了5萬元。奇怪的是,整個過程,宋女士沒有和盜刷銀行卡的人有過任何的溝通、接觸,也無法提供盜刷銀行卡的人的任何信息。
  • 溪谷簡訊-遊戲行業常用簡訊模板
    【應用行業】遊戲研發商、遊戲運營商、廣告媒體【應用產品】驗證碼簡訊、通知簡訊、營銷簡訊【應用模式】玩家註冊驗證類簡訊遊戲運營及日常維護遊戲下載、推廣等【行業概況】近年來簡訊平臺可以為遊戲行業提供簡訊驗證碼、活動推廣、上線邀請、下載推廣、服務反饋等溝通宣傳方式。能有效的提升玩家粘性,促進活躍玩家數量的提升。【應用場景】1、玩家註冊【遊戲名】您本次申請的註冊驗證碼是【數字】,請勿洩露他人!如非本人操作請忽略。
  • 雙重驗證怎麼關閉圖文教程 蘋果手機雙重認證收不到驗證碼怎麼辦
    那就可能蘋果網絡抽風延時了,先用設置的信任電話簡訊驗證碼登錄吧。  受信任的設備  受信任的設備是您已使用雙重認證登錄的設備,可以是裝有 iOS 9 及更高版本的 iPhone、iPad 或 iPod touch 或者裝有 OS X El Capitan 及更高版本的 Mac。
  • 央視曝光新型手機「驗證碼」騙局!
    (溫馨提醒:視頻請在wifi條件下觀看,土豪請隨意)  央視新聞中報導了一起「驗證碼」騙局,受害者叫小許,一名剛剛參加工作不久的大學畢業生。因為一條簡訊和一個驗證碼,一夜之間小許的支付寶、銀行卡信息都被攻破,所有銀行卡的資金全被轉移。