【问题标题】:how to implement OTP for a transaction如何为交易实施 OTP
【发布时间】:2018-04-10 17:03:57
【问题描述】:

我正在使用 android studio 和 SQLite db。我想在我的应用程序中实现 OTP。有一个发送者和一个接收者用户。 Receiver 将生成 otp 并将其提供给 sender。然后 sender 将使用此 otp 发送资金。

现在我可以使用随机数生成器生成 otp,我想让这个 otp 在 5 分钟内有效,并且在那段时间如果 sender 进行交易,那么没关系,否则 otp 会变为无效,交易将失败。这个怎么做? SQLite db可以吗?我有 transactions 表,其中 otp 作为其列之一。到目前为止,我只有以下代码来生成 otp。有人帮我写更多代码。

otp 从 MainActivity 中的 receiver 生成代码-

public int generateOTP(int maxNumber,int minNumber){
  Random r=new Random();
  int randomNumber = r.nextInt((maxNumber-minNumber)+1)+minNumber;
  return randomNumber;
}

【问题讨论】:

    标签: android sqlite one-time-password


    【解决方案1】:

    您可以添加一个额外的列,例如 otpissued 用于将交易时间与 OTP 一起存储,然后检查它是否在时间范围内。

    除了当前时间之外,不会向请求的发送者提供时间或提供它,因此无法绕过检查(除非发送者可以使用数据库操纵设备上的时间)。

    例如以下是交易表:-

    使用:-

    `INSERT INTO transactions VALUES(null,1234, julianday('now'));`
    
    • 注意 1234 用于演示目的,它将是生成的密码

    会添加一行。

    对于演示行可以使用

    • SELECT id, otp, otpissued, strftime('Addded on %Y-%m-%d at %H:%M:%S',otpissued) AS issued_date_time FROM transactions;
    • 这只是让交易日期更易于阅读。

    所以事务表可以是:-

    • 实际表格是:

    可以使用以下方式检查交易:-

    -- Check if the transaction is valid no row = timed out 1 row = valid
    SELECT id,
            CASE WHEN julianday('now') >= otpissued 
                AND julianday('now') <= julianday(otpissued,'+5 minutes') 
            THEN 'VALID' 
            ELSE 'INVALID'
        END AS validation,
        -- Used for testing/demonstation
                otp,
                strftime('%Y-%m-%d %H:%M %S',julianday('now')) AS current_date_time, -- FOR TESTING/DEMO
                strftime('%Y-%m-%d %H:%M %S',otpissued) AS otp_date_time, -- FOR TESTING/DEMO
                strftime('%Y-%m-%d %H:%M %S',otpissued, '+5 minutes') AS otp_expiry , -- FOR TESTING/DEMO
                julianday(otpissued) AS issued_jd, -- FOR TESTING/DEMO
                julianday(otpissued,'+5 minutes') as expiry_jd -- FOR TESTING/DEMO
        -- End of additional columns for testing/demonstration
        FROM transactions
        WHERE otp = 1234 
        --Alternative will output no rows if invalid (outside time-frame) 1 or more rows if valid (within time-frame)
        --WHERE otp = 1234 AND (julianday('now') >= otpissued AND julianday('now') <= julianday(otpissued,'+5 minutes'));
    

    这可能会导致(过期超过 5 分钟):-

    当然,上面的检查是:-

    SELECT id,
            CASE WHEN otp = 1234 
                AND julianday('now') >= otpissued 
                AND julianday('now') <= julianday(otpissued,'+5 minutes') 
            THEN 'VALID' 
            ELSE 'INVALID'
        END AS validation
        FROM transactions
        WHERE otp = 1234;
    

    在这种情况下,结果将是(如果没有交易符合 WHERE 标准,即具有正确的 otp,则为空):-

    如果添加了新行:-

    测试有效

    (请注意,您可能没有相同的 OTP,并且可能更有选择性,例如使用事务 ID,因此您只能检查 1 行,但这是一个演示

    那么冗长的检查会导致:-

    紧凑检查是:-

    【讨论】:

      【解决方案2】:

      我认为最好实施 RFC6238 也称为基于时间的一次性密码,以便获得正确的 OTP 实施。

      此外,就安全性而言,随机并不是接收一次性密码的最佳方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 2020-10-24
        • 2011-05-15
        • 2016-08-02
        • 1970-01-01
        相关资源
        最近更新 更多