时间戳解析失败

我们是博格

我正在开发一个Spring-MVC应用程序,为此我正在开发一个密码重置程序。在这种情况下,我要发送一个手动创建的令牌,该令牌将emailid:timestamp:secretkey加密为令牌。验证令牌时,它无法验证时间,该时间少于24小时。我正在发布我的代码。请让我知道我在做什么错:

ServiceClass:

@Service
public class PersonServiceImpl implements PersonService {

    private static final String HMAC_ALGO = "HmacSHA256";
    private static final String TOKEN_SEPARATOR = ":";
    private static final long MAX_AGE = 1_000 * 60 * 60 * 24; // 24h
     private static final String signKey = "secretvalue";
 @Override
    public void createToken(String username){
        long timestamp = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();
        sb.append(generateTokenStringPublicPart(username, timestamp));
        sb.append(TOKEN_SEPARATOR);
        try {
            sb.append(computeSignature(username, timestamp, signKey));
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
}
 private static String generateTokenStringPublicPart(String username, long timestamp) {
        StringBuilder sb = new StringBuilder();
        sb.append(username);
        sb.append(TOKEN_SEPARATOR);
        sb.append(timestamp);
        return sb.toString();
    }

    private static String computeSignature(String username, long timestamp, String secretKey) throws InvalidKeyException, NoSuchAlgorithmException {
        StringBuilder sb = new StringBuilder();
        sb.append(generateTokenStringPublicPart(username, timestamp));
        SecretKeySpec sks = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), HMAC_ALGO);
        Mac hmac = Mac.getInstance(HMAC_ALGO);
        hmac.init(sks);
     return Base64.encodeBase64URLSafeString(hmac.doFinal(sb.toString().getBytes(StandardCharsets.UTF_8)));
    }

 public static boolean verifyToken(String token) throws InvalidKeyException, NoSuchAlgorithmException {
        String[] parts = token.split(TOKEN_SEPARATOR);
        boolean result = false;
        if (parts.length == 3) {
            String username = parts[0];
            System.out.println("username in verify token is"+username);
            Long timestamp = Long.valueOf(parts[1]);
            System.out.println("Current timestamp of token is"+timestamp);
            String signature = parts[2];
            if (signature.equals(computeSignature(username, timestamp, signKey))) {
                if (System.currentTimeMillis() - timestamp < MAX_AGE) {  // It fails here
                    result = true;
                }else {
                    System.out.println("Timestamp remaining is"+(System.currentTimeMillis() - timestamp));
                    System.out.println("Time verificaiton failed");
                }
            }
            else {
                System.out.println("Signature is not equal");
            }
        } else{
            System.out.println("Token parts are not 3"+parts.length);
        }

        return result;
    }

控制台输出:

Token value is [email protected]:1416659092440:MUYLhJS24EIQv5f-Ak7TXyzWKZSjSFKjcmJkJx2SVew
username in verify token is [email protected]
Current timestamp of token is 1416659092440
Timestamp remaining is 173238774
Time verificaiton failed
Token verification failed
乔迪·卡斯蒂利亚

问题在于Java的乘法/除法运算在加/减之前完成

尝试:

  if ((System.currentTimeMillis() - timestamp) < MAX_AGE) { 

MAX_AGE的定义也是错误的:

    private static final long MAX_AGE = 1000 * 60 * 60 * 24; // 24h

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

时间戳解析失败

来自分类Dev

Logstash:解析apache访问日志的时间戳导致解析失败

来自分类Dev

SparkSQL时间戳查询失败

来自分类Dev

pyspark中的时间戳解析

来自分类Dev

Elasticsearch 无法解析 [时间戳]

来自分类Dev

Bigquery 从时间戳中提取失败

来自分类Dev

在Java中解析js时间戳

来自分类Dev

Golang中的完全解析时间戳

来自分类Dev

使用JavaScript解析Apache日志时间戳

来自分类Dev

在Spark中解析不同的时间戳格式

来自分类Dev

jq null Unix时间戳解析问题

来自分类Dev

在Java中解析js时间戳

来自分类Dev

DateTime解析ANSI C时间戳

来自分类Dev

Logstash - 从 JSON 解析对象设置时间戳

来自分类Dev

如何解析R中的时间戳?

来自分类Dev

解析包含特殊字符(引号)的时间戳

来自分类Dev

SED 在时间戳之间解析 apache 日志

来自分类Dev

解析包含日期,时间和偏移量的时间戳

来自分类Dev

moment.js不会从时间戳解析时间

来自分类Dev

使用strptime解析相对于本地时间的时间戳

来自分类Dev

将 UTC 时间戳解析为本地时间,忽略时区

来自分类Dev

PHP date()在32位上的高时间戳失败

来自分类Dev

Symfony2 FOSRestBundle时间戳验证失败

来自分类Dev

在Laravel 5.2中从Postgresql时间戳返回JSON失败

来自分类Dev

由于文件的时间戳,尝试编译Python失败

来自分类Dev

Laravel `assertSee` 失败,因为时间戳向后?

来自分类Dev

解析模棱两可的时间戳

来自分类Dev

从二进制文件解析Unix时间戳

来自分类常见问题

在Python中解析非零填充时间戳