Contraseñas almacenadas en texto plano en Django Admin

Al configurar la interfaz de administración de nuestro usuario, sea personalizado o no, debemos heredar de la clase.

UserAdmin

Si simplemente implementamos la administración con una linea como la siguiente:

admin.site.register(User, CustomUserAdmin)

Al editar un nuevo usuario el sistema de cifrado de Django no procesará la petición y, por lo tanto, la contraseña quedará almacenada en texto plano en nuestra base de datos. Contraseña que, además, no servirá para autenticar al usuario ya que Django tratará de decodificar la contraseña que ya de por sí está decodificada en la base de datos para compararla con la introducida por el usuario.

Por suerte la solución es bien sencilla. Simplemente deja tu admins.py así:

from django.contrib.auth.admin import UserAdmin
class CustomUserAdmin(UserAdmin):
    pass

admin.site.register(User, CustomUserAdmin)

O si no quieres personalizar las opciones de tu usuario, así:

from django.contrib.auth.admin import UserAdmin

admin.site.register(User, UserAdmin)

UserViewSet Django User – Ejemplo completo

http GET 127.0.0.1:8000/users/ ‘Authorization: Token e9e95a81da6f5c3e37ed63ef3c2eb75d0ae1a694’

# serializers.py
class UserSerializer(serializers.ModelSerializer):

    """ Returns all the Avatars id related to one user. Must set the related_name from the many part. """
    avatars = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    class Meta:
        model = User
        fields = ('id', 'email', 'avatars', 'account_type', )

    def create(self, validated_data):
        """
        We've to override the create serializer method in order to call to our custom create_user
        http://www.django-rest-framework.org/api-guide/serializers/#saving-instances
        :param validated_data: Incoming POST data
        :return: A created user instance
        """
        user = User.objects.create_user(
            email = validated_data['email'],
            username = validated_data['username'],
            password = validated_data['password'],
        )
        return user

Antes

# urls.py
urlpatterns = [
    url(r'^users/$', views.UserList.as_view()),
    url(r'^user/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()),
]


# views.py
class UserList(generics.ListAPIView):
    """ Returns a list with all the users data. """
    queryset = User.objects.all()
    serializer_class = UserSerializer


class UserDetail(generics.RetrieveAPIView):
    """ If exists, returns a list with the data of the selected user."""
    queryset = User.objects.all()
    serializer_class = UserSerializer

Deespués

router = DefaultRouter()
router.register(r'users', UserViewSet, 'User')

# Enlazamos con las urls tradicionales
urlpatterns += router.urls
class UserViewSet(viewsets.ViewSet):
    """
    A simple ViewSet for listing or retrieving users.
    """
    # queryset = User.objects.all()
    # @detail_route(methods=['post'], permission_classes=[AllowAny], url_name='list')
    def list(self, request):
        queryset = User.objects.all()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        queryset = User.objects.all()
        user = get_object_or_404(queryset, pk=pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)

Don’t be evil

the google guys say
life’s more than just the money
do good and do well

ruthless people say
“don’t be evil” is naive
greed obscures vision

gold rush in china
civil rights violations
rationalizing

not conventional?
don’t intend to become so?
re-evaluate

no more censorship
part of repressive program
hong kong redirect

back to core values
principled approach yields trust
trust is everything

net neutrality
all bits created equal
except wireless

“no direct access”
warrantless wiretapping
more transparency

born into bondage
idealism disrupts
splinter in your mind

a bit uncharted
trying to figure it out
positive impact

act honorably
do the right thing alphabet
too conventional

 

http://dontbeevil.com/

La historia del cifrado César

El cifrado César es una de las técnicas de codificación más básicas que existen, si bien es una excelente e interesante forma de iniciarse en el mundo del cifrado. En su forma original consiste en trasladar las palabras del texto a cifrar un número determinado de posiciones en el alfabeto. Este número de posiciones será la clave que necesitaremos para descifrar más tarde nuestro mensaje. Así en un simple ejemplo si quisiéramos cifrar la letra con una clave 6, simplemente desplazaríamos nuestra letra 6 posiciones en el alfabeto: a, b, c, d, e, f, g. Para descifrar la g, repetiríamos el proceso pero en orden contrario: g, f, e, d, c, b, a.

En esta imagen se muestra la codificación de la palabra ‘HOLA’ con una clave = 13.
Mapa con las conquistas de Cayo Julio César

Como podrías estar pensando, el cifrado César algo tiene que ver con el César que todos conocemos: Cayo Julio César. Resulta que allá por el 80a.c, este indiscutible genio militar precisaba de un mecanismo seguro para comunicarse con sus generales. Como entenderás, por aquel entonces era difícil incluso encontrarse con un enemigo que supiera leer, y mucho más difícil que supiera leer latín. Pero como al imperio Romano le dio por poner, a base de sangre y fuego esta lengua de moda, nuestro amigo tuvo tomar precauciones y buscarse otra forma de comunicar sus famosas estrategias. Y mirando el mapa de sus conquistas de la derecha, suponemos que este mecanismo fue bastante eficiente. Algo digno de mencionar es que la clave que empleaba era siempre la misma: 3, pues de esta forma lograba sincronizar receptores y emisores sin necesidad de mandar mensajeros de más que transportaran una clave distinta junto a cada mensaje.

Si tenía que decir algo confidencial, lo escribía usando el cifrado, esto es, cambiando el orden de las letras del alfabeto, para que ni una palabra pudiera entenderse. Si alguien quiere decodificarlo, y entender su significado, debe sustituir la cuarta letra del alfabeto, es decir, la D por la A, y así con las demás.

Suetonio, Vida de los Césares 56
El cifrado César es, además, una bonita forma de iniciarse e el mundo de la programación. En el siguiente enlace podrás encontrar el código en Java de este cifrado: https://erwol.com/es/blog/cifrado-cesar-escrito-en-java/