
Security News
The Nightmare Before Deployment
Season’s greetings from Socket, and here’s to a calm end of year: clean dependencies, boring pipelines, no surprises.
redis-entities
Advanced tools
You can install RedisEntites from this Github repository with python3 setup.py install,
or just install it directly from pypi with pip3 install redis-entities.
Redis Entities is a small library that allows you to map represent certain entities in Redis. An Entity could be for example a Hashmap type and stores information about one User that currently requested a password reset. Each Entity has a predefined Prefix used to differentiate the different types of Entities you create. There are 3 different RedisEntities you can use:
RedisListEntityRedisSetEntityRedisHashmapEntityIn addition there are a couple of mixins, which can be used to provide additional functionality to your entities. There are 3 different Mixins you can use:
HashedIdentifierMixin: All identifiers are hashed before stored in RedisAuthenticatedEncryptionMixin: All values are encrypted and authenticated before stored in RedisDeterministicAuthenticatedEncryptionMixin: All values are encrypted and authenticated deterministically (the same value is encrypted to the same ciphertext) before stored in RedisYou can also combine multiple Mixins, except AuthenticatedEncryptionMixin and DeterministicAuthenticatedEncryptionMixin.
To create an own Entity, just subclass from one of the Provided RedisEntity Base classes.
Note, that every Entity has to set the RedisClient Class Attribute to an instances of Redis from redis-py, or
a class that supports all methods that Redis from redis-py does.
Under the hood all keys are stored as strings, and all values are stored as bytes in Redis.
import redis
from redis_entities import RedisListEntity
from redis_entities.mixins import AuthenticatedEncryptionMixin
class JobQueueEntity(RedisListEntity, AuthenticatedEncryptionMixin):
RedisClient = redis.Redis(...)
Prefix = "JobQueue"
AesKey = b"deaddeaddeaddeaddeaddeaddeaddead" # AES-128 in this case
JobQueueEntity.lpush("Worker1", "command1")
assert JobQueueEntity.length("Worker1") == 1
Supported Methods are:
lpushbrpoplindexlengthclearimport redis
from redis_entities import RedisSetEntity
from redis_entities.mixins import DeterministicAuthenticatedEncryptionMixin
class AccessTokensEntity(RedisSetEntity, DeterministicAuthenticatedEncryptionMixin):
RedisClient = redis.Redis(...)
Prefix = "AccessTokens"
Expire = 180
AesKey = b"deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead" # need to be twice the size of the key required by the underlying cipher (e.g. 64 bytes for AES-256)
AccessTokensEntity.add("User1", "Token1")
AccessTokensEntity.add("User2", "Token1")
assert AccessTokensEntity.exists("User1", "Token1") is True
Supported Methods are:
adddeleteclearexistslist_alllengthNOTE: It is strongly recommended to use the DeterministicAuthenticatedEncryptionMixin instead of the AuthenticatedEncryptionMixin when you are working with RedisSetEntity , as most methods need to know the exact value that is stored in Redis. With the DeterministicAuthenticatedEncryptionMixin , the same plaintext results in the same ciphertext and thus makes this possible.
import redis
from redis_entities import RedisHashmapEntity,
from redis_entities.mixins import HashedIdentifierMixin, AuthenticatedEncryptionMixin
class VerifyEmailTokens(RedisHashmapEntity, HashedIdentifierMixin, AuthenticatedEncryptionMixin):
RedisClient = redis.Redis(...)
Prefix = "VerifyEmailTokens"
Contents = (
"MandatoryKey1",
"MandatoryKey2"
)
Expire = 180
HashName = "sha512_256"
Salt = b"VerifyEmailTokens"
AesKey = b"deaddeaddeaddeaddeaddeaddeaddead"
VerifyEmailTokens.store("test@example.com", MandatoryKey1="Value1", MandatoryKey2="Value2")
loaded_entity = VerifyEmailTokens.load("test@example.com")
assert loaded_entity.MandatoryKey1 == b"Value1"
assert loaded_entity.MandatoryKey1 == b"Value2"
assert VerifyEmailTokens.exists("test@example.com") is True
Supported Methods are:
store
load
exists
delete
length
FAQs
Redis Entities
We found that redis-entities demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Season’s greetings from Socket, and here’s to a calm end of year: clean dependencies, boring pipelines, no surprises.

Research
/Security News
Impostor NuGet package Tracer.Fody.NLog typosquats Tracer.Fody and its author, using homoglyph tricks, and exfiltrates Stratis wallet JSON/passwords to a Russian IP address.

Security News
Deno 2.6 introduces deno audit with a new --socket flag that plugs directly into Socket to bring supply chain security checks into the Deno CLI.