前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块

Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块

作者头像
GH
发布于 2019-12-16 07:52:33
发布于 2019-12-16 07:52:33
91100
代码可运行
举报
运行总次数:0
代码可运行

使用Django对中间件的调用思想完成自己的功能

中间件的调用只需要在配置文件中添加,如果不使用某个中间件,只需要在配置文件中将对应的字符串注释掉就可以,这种调用执行某一代码的方式是不是很方便呢?下面我们就利用Django对中间件的调用的思想,将自己的功能也实现和中间件一样的调用方式。

功能要求

假设实现的功能:信息的群发,要求我们写好的信息只需要一键发送就可以通过邮件、短信、微信三种方式一起发送出去,如果我们不需要某种通知方式只需要在配置文件中将其注释掉就可以。

importlib模块介绍

动态导入模块importlib,可以按照填入的以点隔开的字符串文件路径获的方式取到对应的文件。使用方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module_path = 'notify.msg'
md = importlib.import_module(module_path) #md就是notify文件夹下的msg文件

如果需要获取文件里面定义的函数或者类,可以使用反射的方法(这里将文件当做一个对象,一切皆对象)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cls = getattr(md,cls_name)#将文件名作为对象右面填类的名字就能拿到对应的类

功能的实现

1.建一个群发信息功能的包如下图,将每一张发送信息的方式写在一个独立的文件中。

2.在每一个通知文件中定义对应的通知类如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Msg:
    def __init__(self):
        pass

    # 发送信息前的准备

    def send(self, content):
        print(f'Msg通知:{content}')

3.将每一个文件添加到配置文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NOTIFY_LISTS = [
    'notify.email.Email',
    'notify.msg.Msg',
    'notify.qq.Qq',
    'notify.WeChat.WeChat'
]

4.在init中对类的查找和实例化进行处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import importlib
import settings
def send_all(content):
    for path in settings.NOTIFY_LISTS:
        module_path,cls_name = path.rsplit('.',maxsplit=1)
        module = importlib.import_module(module_path)
        cls = getattr(module,cls_name)
        obj = cls()
        obj.send(content)

5.在start中调用包实现消息群发的功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os,sys
from notify import send_all


sys.path.append(os.path.dirname(__file__))

if __name__ == '__main__':
    send_all('现在测试通知')
    
Email通知:现在测试通知
Msg通知:现在测试通知
QQ通知:现在测试通知
WeChat通知:现在测试通知

至此功能基本实现。

csrf中间件详细介绍

跨站请求伪造

csrf全称Cross-site request forgery(跨站请求伪造), 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

跨站请求伪造最常见的应用如钓鱼网站,钓鱼网站的具体钓鱼方式:钓鱼网站伪造一个和正规网站界面一模一样的网站,然后将转账(支付)功能的的form表单进行修改,当用户登录时提供的是正规网站的登录接口,而用户支付或转账的对方账户是假的,下面隐藏的是预先设定好的账户(input框的name和value),这样用户每次给对方进行转账都会将钱转到预先设定好的账户。如何解决跨站请求伪造呢?

从服务端的角度来解决这个问题的思路就是如果每次服务端都能识别出来向我提交请求的是我自己的页面还是别人的页面,那么钓鱼网站就无法在用户访问服务器的过程中伪装成服务端网页给服务端发送转账请求了。而Django中的中间件就是通过这种思想解决跨站请求伪造的问题的。

Django csrf中间件

当用户访问有Django csrf中间件的服务端时Django csrf中间件会给用户的get请求的页面携带一个随机字符串,当用户发送post请求时会校验用户的随机字符串,如果如果校验不通过则直接报403错误,禁止用户提交post请求。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="hidden" name="csrfmiddlewaretoken" value="rJ47FeK9T55wavvVJGY6UxdM1kTMHhTqotGfaXjXIK8Ahz2Uvs02yR9T8bBn5q2D">

能否提交post请求的通常是form表单和ajax请求,Djangocsrf中间件在两种post请求中的使用方式是不同的,具体使用方法如下:

form表单

我们只需在form表单中添加{% csrf_token %}。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>target_account:<input type="text" name="target_user"></p>
    <p>money:<input type="text" name="money"></p>
    <input type="submit">
</form>
<input type="hidden" name="csrfmiddlewaretoken" value="rJ47FeK9T55wavvVJGY6UxdM1kTMHhTqotGfaXjXIK8Ahz2Uvs02yR9T8bBn5q2D">           

ajax

ajax有三种方式添加中间件标签。

方式一

先在页面任意的位置上书写{% csrf_token %},然后在发送ajax请求的时候通过标签查找获取随机字符串添加到data自定义对象即: data:{'username':'xxx','csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},

方式二

data:{'username':'xxx','csrfmiddlewaretoken':'{{ csrf_token }}'}

方式三(官方提供,建议使用此方法)

新建一个js文件,将下面的代码拷贝进去,在ajax上面导入即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
  // these HTTP methods do not require CSRF protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
  beforeSend: function (xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
      xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
  }
});

导入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="/static/setup.js"></script>

csrf相关装饰器

csrf相关的装饰器可以按照我们的需求给某个视图函数加csrf校验,或者不给某个视图函数加csrf校验。

csrf_exempt

不给某个视图函数加csrf校验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt  # 不校验 csrf
def index(request):
    return HttpResponse('index')
csrf_protect

给某个视图函数加csrf校验,这里需要在settings文件中将csrf中间件注释掉。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@csrf_protect  # 校验
def login(request):
    return HttpResponse('login')

在CBV上加csrf装饰器

csrf_exempt

只有一种加装饰器的方法,就是先导入method_decorator方法,然后在类中定义dispatch方法然后将其装饰在dispatch方法上面。@method_decorator(csrf_exempt)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# @method_decorator(csrf_exempt,name='post')  # csrf_exempt不支持该方法
@method_decorator(csrf_exempt,name='dispatch')  # csrf_exempt
class MyIndex(views.View):
    # @method_decorator(csrf_exempt)  # 可以
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)
    def get(self,request):
        return render(request,'transfer.html')
    # @method_decorator(csrf_exempt,name='post')  # csrf_exempt不支持该方法
    def post(self,request):
        return HttpResponse('OK')       
    # csrf_exempt这个装饰器只能给dispatch装才能生效
csrf_protect

csrf_protect装饰器用普通加装饰器的方法就可以跟普通的装饰器装饰CBV用法一样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# @method_decorator(csrf_protect,name='post')  # 可以
class MyIndex(views.View):
    @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)
    def get(self,request):
        return render(request,'transfer.html')
    # @method_decorator(csrf_protect)  # 可以
    def post(self,request):
        return HttpResponse('OK')

Django settings源码剖析及模仿使用

Django settings源码剖析

Django有两个配置文件,一个是用户可以看到的settings文件,另一个是内部的全局的配置文件,这两个配置文件的执行方式是如果用户配置了就用用户配置的settings文件,如果用户没有配置settings文件就用内部的settings文件。那么这一功能Django是如何实现的呢?一起来看看Django settings的源码。

查看内部配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.conf import settings#配置文件实例化出的一个类
from django.conf import global_settings#配置文件

我们进入第一个settings:发现settings使用了单例模式,

进入LazySettings类里面:

进入manage.py查看项目启动时的配置:

再看LazySettings类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def _setup(self, name=None):
        """
        Load the settings module pointed to by the environment variable. This
        is used the first time we need any settings at all, if the user has not
        previously configured the settings manually.
        """
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
        # os.environ是一个全局的大字典,而settings_module获取了key为ENVIRONMENT_VARIABLE的值,从manage.py中可以看出settings_module获取到的就是用户配置文件路径:项目名.settings
        if not settings_module:
            desc = ("setting %s" % name) if name else "settings"
            raise ImproperlyConfigured(
                "Requested %s, but settings are not configured. "
                "You must either define the environment variable %s "
                "or call settings.configure() before accessing settings."
                % (desc, ENVIRONMENT_VARIABLE))

        self._wrapped = Settings(settings_module)
        #settings路径传入了Settings,我们进Settings里面看看。
        
class Settings(object):
    def __init__(self, settings_module):
        # update this dict from global settings (but only for ALL_CAPS settings)
        for setting in dir(global_settings):#获取全局配置文件中所有变量名
            if setting.isupper():#只获取是大写的变量名,这就是为啥配置文件中所有的变量名都是大写的
                setattr(self, setting, getattr(global_settings, setting))#setattr将获取到global_settings的变量值添加到settings对象自己的属性中

        # store the settings module in case someone later cares
        self.SETTINGS_MODULE = settings_module#项目名.settings

        mod = importlib.import_module(self.SETTINGS_MODULE)
        #导入暴露给用户的配置文件,相当于from 用户名 import settings

        tuple_settings = (
            "INSTALLED_APPS",
            "TEMPLATE_DIRS",
            "LOCALE_PATHS",
        )
        
        
     self._explicit_settings = set()
        for setting in dir(mod):#获取用户配置文件中所有的变量名
            if setting.isupper():
                setting_value = getattr(mod, setting)#利用反射取出所有的变量值

                if (setting in tuple_settings and
                        not isinstance(setting_value, (list, tuple))):
                    raise ImproperlyConfigured("The %s setting must be a list or a tuple. " % setting)
                setattr(self, setting, setting_value)#将用户settings的属性和属性值写入settings对象中
                #到这里我们可以看到,实例化出的settings对象先将全局配置文件中的变量名和变量值写入,然后再将用户配置文件的变量名和变量值写入,这样如果用户配置文件配置了对应的变量名和变量值就会替换掉全局的,从而实现了如果用户配置了settings就用用户的,如果用户没有配置,就用全局的配置文件的功能。
                self._explicit_settings.add(setting)

        if not self.SECRET_KEY:
            raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")

模仿使用

模仿使用其实就是模仿用户settings配置文件如果设置了就用用户的,如果没有设置就用内置的这个功能。

我们只需要在全局配置文件包的__init__中写如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import importlib
from lib.conf import global_settings
import os

class Settings(object):
    def __init__(self):
        for name in dir(global_settings):
            if name.isupper():
                setattr(self,name,getattr(global_settings,name))
        # 获取暴露给用户的配置文件字符串路径
        module_path = os.environ.get('xxx')
        md = importlib.import_module(module_path)  # md = settings
        for name in dir(md):
            if name.isupper():
                k = name
                v = getattr(md,name)
                setattr(self,k,v)


settings = Settings()

Auth模块

auth简介

Auth模块是Django自带的用户认证模块:

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。

auth模块常用方法

功能

代码

创建用户

from django.contrib.auth.models import User User.objects.create_user(username=username,password=password) # 创建普通用户,密码自动加密 User.objects.create_superuser(username=username,password=password,email='123@qq.com') # 创建超级用户

校验用户名和密码

from django.contrib import authuser_obj = auth.authenticate(request,username=username,password=password)

保存用户登录状态

auth.login(request,user_obj) 只要这句话执行了后面在任意位置 只要你能拿到request你就可以通过request.user获取到当前登录的用户对象

判断当前用户是否登录

request.user.is_authenticated()

校验原密码

request.user.check_password(old_password)返回bool值

修改密码

request.user.set_password(new_password) request.user.save() 千万不要忘了save

注销

auth.logout(request)

校验用户登录装饰器

from django.contrib.auth.decorators import login_required 局部配置 @login_required(login_url='/login/') def index(request): pass 全局配置 settings配置文件中直接配置 LOGIN_URL = '/login/' @login_required def index(request): pass 如果全局和局部都配置了以局部的为准

创建用户

create_user()

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等,用户名和密码是必须提供的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...

校验用户名和密码

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
user = authenticate(username='usernamer',password='password')

保存用户登录状态

该函数接受一个HttpRequest对象,以及一个经过认证的User对象。

该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib.auth import authenticate, login
   
def my_view(request):
  username = request.POST['username']
  password = request.POST['password']
  user = authenticate(username=username, password=password)
  if user is not None:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return an 'invalid login' error message.
    ...

判断当前用户是否登录

判断当前用户是否登录(发送的当前请求是否已经登录)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

校验原密码

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ok = user.check_password('密码')

修改密码

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法!!!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
user.set_password(password='')
user.save()

注销

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib.auth import logout
   
def logout_view(request):
  logout(request)
  # Redirect to a success page.

校验用户登录状态装饰器

局部登录认证装饰器

@login_required(login_url='/login/')判断用户是否登录如果没有则直接跳转到登录页面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib.auth.decorators import login_required
      
@login_required
def my_view(request):
  ...

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由
全局登录认证装饰器

在settings文件直接配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOGIN_URL = '/login/'#如果全局和局部都配置了以局部的为准

User对象属性(用户登录权限和管理权限)

User对象属性:username, password

is_staff : 用户是否拥有网站的管理权限.

is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

扩展auth_user表字段

方式一

思路:再建一张表,使这张表和auth_user表是一对一的关系,这样可以实现对auth_user表字段的增加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserDetail(models.Model):
    phone = models.BigIntegerField()
    user = models.OneToOneField(to='User')

方式二

思路:自定义一个类和原来的auth_user继承同一个基类,然后自定义类中的字段,这里需要说明的是在自定义类之前不能执行数据库迁移命令,定义好才能执行数据库迁移命令。另外,定义好类之后需要在配置文件中添加下面的配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#自定义类
from django.contrib.auth.models import AbstractUser
class Userinfo(AbstractUser):
    phone = models.BigIntegerField()
    register_time = models.DateField(auto_now_add=True)
    
#配置文件中添加
AUTH_USER_MODEL = 'app01.Userinfo'  # 应用名.表名

上面的步骤完成之后,auth模块的功能都可以在你定义的表中使用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Android APK 签名校验[通俗易懂]
非对称加密算法需要两个密钥:公开密钥(简称公钥)和私有密钥(简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
全栈程序员站长
2022/09/03
5.3K0
Android APK 签名校验[通俗易懂]
Android V1及V2签名签名原理简析
Android为了保证系统及应用的安全性,在安装APK的时候需要校验包的完整性,同时,对于覆盖安装的场景还要校验新旧是否匹配,这两者都是通过Android签名机制来进行保证的,本文就简单看下Android的签名与校验原理,分一下几个部分分析下:
看书的小蜗牛
2019/05/14
2.7K0
AndroidV1,V2,V3签名原理详解
背景介绍: 一般开发者会指定使用自己创建的证书,如果没有指定,则会默认使用系统的证书,该默认的证书存储在C:\Users\admin.android\debug.keystore,不同的电脑可能安装不同路径。一个签名证书文件中,是包含一对公私钥,用私钥对apk进行签名,在安装到android手机时,系统会使用证书中对应签名私钥的公钥来验证,查看apk是否被更改过,如果没有则可以安装在手机上。任何的app store都不允许使用默认的debug.keystore打包的apk发布上去,因为debug.keystore的密码是默认的,不安全。 一,没有签名的APK无法安装 Android的APK要进行签名才能够安装到手机上,这是因为在安装的时候系统会进行检测,平时我们直接点AS里面那个绿色的运行按钮也能够直接安装到手机上,这是因为其实它也进行了签名,只不过AS自动帮我们做了这个操作有个默认的签名
北洋
2021/12/08
1.1K0
AndroidV1,V2,V3签名原理详解
移动安全(二)|APK打包流程及签名安全机制初探
切入正题,胡小毛在学习Android逆向的过程中又有所总结,先来看看apk文件结构:
用户1631416
2020/03/12
1.1K0
Android 新一代多渠道打包神器
李涛
2017/04/21
6.4K2
Android 新一代多渠道打包神器
【专业技术】Android如何保证安全?
存在问题: 那么多小伙伴想root,root后好处多多你懂的,那么开发的小伙伴最想关心的是安全机制问题。 解决方案: 我们就以此来了解一下Android 安全机制 安卓有一套自己的安全权限机制,大部分来自linux的权限机制,某些地方也做了延伸,比如linux中的用户概念,在安卓上来说就相当于app。对于一些刚学习安卓的同学来说,如果之前也没有了解过linux的权限概念,对于安卓的这个安全机制也会比较迷茫,看到一篇文章对于android的这个安全权限机制写的还算不错,推荐初学的同学阅读一下。当然如果某些部
程序员互动联盟
2018/03/15
1.3K0
探究 Android 签名机制和原理
最近在调研一个测试工具的使用,在使用中发现被测试工具处理过的apk文件经安装后打开就会崩溃,分析崩溃日志后原因是签名不一致导致的。
用户5521279
2020/08/30
3.2K0
android签名原理
什么是签名? 在Apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。
老马的编程之旅
2022/06/22
1.2K0
Android应用签名、反编译与防止二次签名
我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行。签名就代表着自己的身份即keystore。小编所在项目,遇到应用被恶意篡改的情况。新版本客户端加入了在线签名逻辑以及防止二次签名逻辑。小编对相关知识加深了理解,并运用在项目测试中,分享给大家。
用户5521279
2019/06/02
5.4K0
细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4
大部分开发者对apk签名还停留在APK v2,对APK v3和APK v4了解很少,而且网上大部分文章讲解的含糊不清,所以根据官网文档重新整理一份。
BennuCTech
2021/12/10
6.6K0
细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4
APK签名流程详解
安卓的签名实际就是产生 MANIFEST.MF/ CERT.SF/ CERT.RSA这3个文件的过程。
全栈程序员站长
2022/08/26
1.1K0
APK签名流程详解
APK 签名:v1 v2 v3 v4
通过对 Apk 进行签名,开发者可以证明对 Apk 的所有权和控制权,可用于安装和更新其应用。而在 Android 设备上的安装 Apk ,如果是一个没有被签名的 Apk,则会被拒绝安装。
全栈程序员站长
2022/08/30
2.3K0
APK 签名:v1 v2 v3 v4
Java中的微信支付(1):API V3版本签名详解
1. 前言 最近在折腾微信支付,证书还是比较烦人的,所以有必要分享一些经验,减少你在开发微信支付时的踩坑。目前微信支付的 API 已经发展到V3版本,采用了流行的 Restful 风格。 微信支付V2与V3的区别 今天来分享微信支付的难点——签名,虽然有很多好用的 SDK 但是如果你想深入了解微信支付还是有帮助的。 2. API 证书 为了保证资金敏感数据的安全性,确保我们业务中的资金往来交易万无一失。目前微信支付第三方签发的权威的 CA 证书(API 证书)中提供的私钥来进行签名。通过商户平台你可以设置
程序猿DD
2023/04/04
2K0
Java中的微信支付(1):API V3版本签名详解
Android签名攻与防
JNI全称是Java Native Interface(Java本地接口)单词首字母的缩写,本地接口就是指用C和C++开发的接口。由于JNI是JVM规范中的一部份,因此可以将我们写的JNI程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/C++写的大量代码。JNI目前提供两种注册方式,静态注册方式实现较为简单,但有一些系列的缺陷,动态注册要复写JNI_OnLoad函数,过程稍微复杂。
Anymarvel
2018/10/22
2.3K0
Android签名攻与防
你可能还不知道的apk签名绕过方法
近期更新Android应用可要注意了,不要随意点个链接就升级,你的正宗应用可能升级成山寨应用哦。 Google在12月发布的安全公告中提到的“Janus”漏洞,可使攻击者在不改变原应用签名的情况上,注入恶意代码。
Erwin
2020/01/02
3.4K0
Android APK 签名原理
Android APK 签名原理涉及到密码学的加密算法、数字签名、数字证书等基础知识,这里做个总结记录。
用户3596197
2018/10/15
3.5K0
浅谈程序的数字签名
数字签名它是基于非对称密钥加密技术与数字摘要算法技术的应用,它是一个包含电子文件信息以及发送者身份,并能够鉴别发送者身份以及发送信息是否被篡改的一段数字串。
小道安全
2022/12/03
1.8K0
浅谈程序的数字签名
深入解析RSA算法原理及其安全性机制
RSA算法是一种广泛使用的公钥加密算法,它的名称来源于其创始人Ron Rivest、Adi Shamir和Leonard Adleman的首字母缩写。该算法于1977年首次被提出,并迅速成为公钥密码学的标准之一。RSA算法的安全性基于大数分解和离散对数等数学难题,使得它在保护数据隐私和完整性方面具有很高的可靠性。
公众号:码到三十五
2024/04/02
1.9K0
深入解析RSA算法原理及其安全性机制
实现Android APK瘦身99.99%
让我们将这一原则应用到 Android App 开发中。我们将玩转一个称为“ApkGolf”的 APK,目的是创建一个尽可能具有最少字节数的 App,并可安装在运行 Oreo 的设备上。
Android技术干货分享
2019/06/13
1.9K0
Java技术专题:「入门到精通系列」深入探索常用的六种加密技术和实现
随着信息安全的日益重要,加密技术在软件开发领域中扮演着关键的角色。Java作为一门广泛应用的编程语言,提供了丰富的加密库和API,使得开发者可以轻松实现各种加密算法。本文将深入探索Java技术中常用到的六种加密技术,包括对称加密、非对称加密、哈希算法、消息摘要、数字签名和数字证书,并通过具体的实现代码帮助读者更好地理解和应用这些加密技术。
IT_陈寒
2024/01/08
3170
Java技术专题:「入门到精通系列」深入探索常用的六种加密技术和实现
相关推荐
Android APK 签名校验[通俗易懂]
更多 >
目录
  • 使用Django对中间件的调用思想完成自己的功能
    • 功能要求
    • importlib模块介绍
    • 功能的实现
  • csrf中间件详细介绍
    • 跨站请求伪造
    • Django csrf中间件
      • form表单
      • ajax
      • csrf相关装饰器
      • 在CBV上加csrf装饰器
  • Django settings源码剖析及模仿使用
    • Django settings源码剖析
      • 查看内部配置文件
    • 模仿使用
  • Auth模块
    • auth简介
    • auth模块常用方法
      • 创建用户
      • 校验用户名和密码
      • 保存用户登录状态
      • 判断当前用户是否登录
      • 校验原密码
      • 修改密码
      • 注销
      • 校验用户登录状态装饰器
      • User对象属性(用户登录权限和管理权限)
    • 扩展auth_user表字段
      • 方式一
      • 方式二
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档