Nginx 安全链接和 java

问题描述 投票:0回答:2

我有一个项目,我需要从我的服务器流式传输视频,我使用 nginx 来完成它,还使用 spring mvc 开发的 webapp 和 tomcat 来包含它。

它是如何工作的:

java应用程序创建md5哈希链接并将其发送给他可以发出请求的客户端,客户端向nginx服务器发出带有哈希参数的请求,nginx服务器检查哈希值并进行处理。

这是创建哈希链接的java代码:

public static void main(String[] args) throws ParseException, NoSuchAlgorithmException {

    String fileName = "bbb.mp4";
    Date date = new Date(System.currentTimeMillis());
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    String monthName = getMonthForInt(month);
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int min = calendar.get(Calendar.MINUTE);

    System.out.println("year " +year +", month "+ month +",day " +day + ", hour " +hour +" min "+ min);

    String str = monthName +" "+ day+" "+year+" "+hour+":"+min+":52.454 UTC";
    SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz");
    Date newDate = df.parse(str);
    long epoch = date.getTime();


    System.out.println(epoch);
    String input =  epoch +"/hls/"+fileName+" enigma";

    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(input.getBytes());
    byte[] enc = md.digest();
    String md5Sum = new sun.misc.BASE64Encoder().encode(enc);
    String hash = md5Sum.substring( 0,md5Sum.length() -2);

    String   link = "http://tutorme.ae/hls/"+fileName+"?md5="+hash+"&expires="+epoch;

    System.out.println(link);
}

输出应该是这样的:

http://tutorme.ae/hls/bbb.mp4?md5=D3U9uEtwHcgyNL3BeyfLsw&expires=1490178647610

所以这段代码可以工作 50%,另外 50% 会产生一个更苗条的链接:

http://tutorme.ae/hls/bbb.mp4?md5=26k/bhvQP6JC1ehR+XmzuA&expires=1490178663810

我不确定为什么会这样做,线索会有所帮助

谢谢

java security nginx
2个回答
0
投票

抱歉,我只是通过添加这行代码来修复它:

         hash = hash.replace("/", "_");

在最后一行。我不知道原因,实际上只是因为 linux 命令行中的哈希值与 java 不同。如果有人能解释一下那就太好了


0
投票

我正在使用您建议的解决方案的修改版,将 302 返回给客户端以重定向下载。根据 nginx_secure_link 模块中的示例,您应该将“+/”替换为“-_”并删除最后 2 个字符

public static void main(String[] args) throws ParseException, NoSuchAlgorithmException {

    String fileName = "bbb.mp4";

    ZonedDateTime validPeriodTime = ZonedDateTime.parse("2024-12-31T00:00:00+01:00[Europe/Paris]");
    long epoch = validPeriodTime.toEpochSecond();

    System.out.println(validPeriodTime);
    System.out.println(epoch);
    String input =  epoch +"/s/"+fileName+" enigma";

    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(input.getBytes());
    byte[] enc = md.digest();
    String md5Sum = Base64.getEncoder().encodeToString(enc);
    String hash = md5Sum.substring( 0,md5Sum.length() -2);
    hash = hash.replace("/", "_").replace("+", "-");

    String link = "http://local.host/s/"+fileName+"?m="+hash+"&e="+epoch;

    System.out.println(link);
}

在这里你可以找到我的 nginx 配置:

location /files {
  root /data/html;
  index index.html index.htm;
}

location /s/ {
  root /data/html;

  add_header Access-Control-Allow-Origin *;

  secure_link $arg_m,$arg_e;
  secure_link_md5 "$arg_e$uri secret";

  if ($secure_link = "") {
    return 403;
  }

  if ($secure_link = "0") {
    return 410;
  }
  rewrite ^/s/(.*)$ /files/$1 break;
}
© www.soinside.com 2019 - 2024. All rights reserved.